“No Action header was found” error message while using SOAP webservice

删除回忆录丶 提交于 2019-11-29 14:33:09

问题


Getting following error while consuming SOAP webservice in iOS App

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

The same webservice working fine in SOAP UI Tool.

Following is the request format

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];

Complete error response received from 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>

Any help really appreciated.


回答1:


We had the same problem with an ASP.NET-based server (error message when using python/suds, same query worked in SoapUi); after a lot of digging, we found that we need to add a SOAP header (as XML element) which contains the action; having the action in the Content-Type or SOAPAction headers was not enough (but does not hurt either). Here's an example of a successful query (from 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>

With Python and SUDS, this is how we did it:

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))

The action can be queried from the method, i.e. if you want to call a method client.service.foo, use

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

We found this by looking at the SoapUi HTTP log. (We also tried Wireshark, but that would not work because we're trying to use an https server which we don't own.)




回答2:


Include

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



回答3:


Finally i able to solve this problem, the content-type and request format are totally different than what i am passing with request

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

So difference is i have to pass action with content type.

Also the request Soap Envelop is totally different with different namespaces

<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>

As the header information is also totally different we have to specify action over there.

Hope it will be helpful to someone, who is facing same problem.



来源:https://stackoverflow.com/questions/16445945/no-action-header-was-found-error-message-while-using-soap-webservice

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!