Сообщение об ошибке "заголовок действия не найден" при использовании SOAP webservice

получение следующей ошибки при потреблении SOAP webservice в приложении iOS

"No Action header was found with namespace 'http://www.w3.org/2005/08/addressing' for the given message."

тот же веб-сервис отлично работает в Soap UI Tool.

Ниже приведен формат запроса

NSString *data = @"<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
<soap:Header></soap:Header>
<soap:Body><tem:GetEvaluators></tem:GetEvaluators></soap:Body>
</soap:Envelope>";

NSString *url = @"webservice url";
NSData *postData = [data dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setHTTPBody:postData];
[request setTimeoutInterval:20.0];
[request setValue:@"application/soap+xml;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"http://tempuri.org/IATCService/GetEvaluators" forHTTPHeaderField:@"SOAPAction"];
 NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

полный ответ на ошибку, полученный от webservice

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
    <a:Action s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/fault</a:Action>
</s:Header>
<s:Body>
    <s:Fault>
        <s:Code>
            <s:Value>s:Sender</s:Value>
            <s:Subcode>
                <s:Value>a:MessageAddressingHeaderRequired</s:Value>
            </s:Subcode>
        </s:Code>
        <s:Reason>
            <s:Text xml:lang="en-US">No Action header was found with namespace 'http://www.w3.org/2005/08/addressing' for the given message.</s:Text>
        </s:Reason>
        <s:Detail>
            <a:ProblemHeaderQName>a:Action</a:ProblemHeaderQName>
        </s:Detail>
    </s:Fault>
</s:Body>

любая помощь очень ценна.

3 ответов


У нас была такая же проблема с ASP.NET-сервер (сообщение об ошибке при использовании python / suds, тот же запрос работал в SoapUi); после Большого рытья мы обнаружили, что нам нужно добавить заголовок SOAP (как элемент XML), который содержит действие; наличие действия в заголовках Content-Type или SOAPAction было недостаточно (но не больно). Вот пример успешного запроса (от SoapUi):

<SOAP-ENV:Envelope xmlns:ns0="..." xmlns:ns1="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope">
   <SOAP-ENV:Header xmlns:wsa="http://www.w3.org/2005/08/addressing"><wsa:Action>http://www.foo.com/.../SomeJob/getParameters</wsa:Action></SOAP-ENV:Header>
   <ns1:Body>
      <ns0:getParameters>...</ns0:getParameters>
   </ns1:Body>
</SOAP-ENV:Envelope>

С Python и SUDS, вот как мы это сделали это:

from suds.sax.element import Element
wsans = ('wsa', "http://www.w3.org/2005/08/addressing")
client.set_options(soapheaders = Element('Action', ns=wsans).setText(action))

действие можно запросить из метода, т. е. если вы хотите вызвать клиент метода.услуга.фу, используй

action = client.service.foo.method.soap.action

мы нашли это, посмотрев на журнал HTTP SoapUi. (Мы также попробовали Wireshark, но это не сработает, потому что мы пытаемся использовать сервер https, которым мы не владеем.)


включить

[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];

наконец, я могу решить эту проблему, тип контента и формат запроса полностью отличаются от того, что я передаю с запросом

Content-Type: application/soap+xml;charset=UTF-8;action="http://tempuri.org/IATCService/GetEvaluators" 

Так разница в действие с типом контента.

также запрос Soap Envelope полностью отличается с различными пространствами имен

<s:Envelope xmlns:s=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:a=\"http://www.w3.org/2005/08/addressing\">  
**<s:Header>
<a:Action s:mustUnderstand=\"1\">http://tempuri.org/IATCService/GetEvaluators</a:Action>     </s:Header>**
<s:Body>
<GetEvaluators xmlns=\"http://tempuri.org/\"/></s:Body>
</s:Envelope>

поскольку информация заголовка также полностью отличается, мы должны указать действие там.

надеюсь, что это будет полезно для кого-то, кто сталкиваются с той же проблемой.