Использование веб-службы приводит к "Невозможно обработать запрос без действительного параметра действия"

Мне нужно использовать веб-сервисы на этом сайте.NET:

https://www.iyardiasp.com/8223third_17/webservices/ItfResidentData.asmx

Для предварительного употребления я использую либо Fiddler, либо curl. Оба выдают одну и ту же ошибку:

<faultstring>Unable to handle request without a valid action parameter. Please supply a valid soap action.</faultstring> 

Моя команда curl:

curl -d @ GetVersionNumber.xml https://www.iyardiasp.com/8223third_17/webservices/ItfResidentData.asmx

Пожалуйста, смотрите файл GetVersionNumber.xml ниже:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
    <GetVersionNumber xmlns="http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData" />
</soap:Body>
</soap:Envelope>

Добавление SOAP-ENV: заголовок как элемент в мыло: конверт не помогает

<SOAP-ENV:Header Content-Type="text/xml" Host="www.iyardiasp.com" SOAPAction="http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData/GetVersionNumber"/>

Добавление действия Soap в качестве заголовка не помогает.

В этом случае команда curl:

curl -H "SOAPAction: http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData/GetVersionNumber" -d @ GetVersionNumber.xml " https://www.iyardiasp.com/8223third_17/webservices/itfapplicantscreening.asmx"

И ответ:

<faultstring>Server did not recognize the value of HTTP Header SOAPAction: http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData/GetVersionNumber.</faultstring>

2 ответа

Решение

Вы должны поставить SOAPAction как заголовок HTTP, а не заголовок SOAP. Вот как может выглядеть завершенный запрос при выполнении с SoapUI (обратите внимание на четвертую строку):

POST /8223third_17/webservices/ItfResidentData.asmx HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: "http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData/GetVersionNumber"
User-Agent: Jakarta Commons-HttpClient/3.1
Host: www.iyardiasp.com
Content-Length: 260

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:itf="http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData">
   <soapenv:Body>
      <itf:GetVersionNumber/>
   </soapenv:Body>
</soapenv:Envelope>

За curl Вы могли бы использовать -H параметр для отправки SOAPAction заголовок, но я предлагаю вам использовать SoapUI для вашего предварительного потребления (он включает в себя SOAPAction заголовок по умолчанию и бьет консоль в любой день).

Если вам нужно использовать curl попробуйте что-то вроде этого (все должно быть в одной строке; разделены для удобства чтения):

curl -H "Content-Type: text/xml;charset=UTF-8" 
     -H "SOAPAction: \"http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData/GetVersionNumber\"" 
     -d @GetVersionNumber.xml 
     https://www.iyardiasp.com/8223third_17/webservices/ItfResidentData.asmx

с этим в GetVersionNumber.xml файл:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:itf="http://tempuri.org/YSI.Interfaces.WebServices/ItfResidentData">
   <soapenv:Body>
      <itf:GetVersionNumber/>
   </soapenv:Body>
</soapenv:Envelope>

Вероятно, никто больше не использует файлы asmx, но я :), и только что столкнулся с проблемой. Общая проблема заключается в том, что в .net нет никаких указаний на то, что это WebMethod, который обрабатывает, среди прочего, запросы мыла.

Другие ответы могут быть правильными по-своему, но для очень простого случая, убедитесь, что ваш метод украшен атрибутом [WebMethod], что решило мою проблему.

      [WebMethod]
public string test() { return "Hello World"];

Атрибут, вероятно, также отвечает за упаковку вашего ответа в мыльную обертку.

А, Майкрософт. Так много автоматического, но еще больше кривой обучения.

Другие вопросы по тегам