Использование веб-службы приводит к "Невозможно обработать запрос без действительного параметра действия"
Мне нужно использовать веб-сервисы на этом сайте.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"];
Атрибут, вероятно, также отвечает за упаковку вашего ответа в мыльную обертку.
А, Майкрософт. Так много автоматического, но еще больше кривой обучения.