使用SOAP Web服务时,“没有findAction头”错误消息

在iOS应用程序中使用SOAP web服务时遇到以下错误

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

同样的webservice在SOAP UI工具中工作正常。

以下是请求格式

 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> 

任何帮助真的很感激。

我们有一个与基于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)) 

该操作可以从方法中查询,即如果你想调用一个方法client.service.foo,使用

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

我们通过查看SoapUi HTTP日志find了这个。 (我们也尝试过Wireshark,但是这不起作用,因为我们正在尝试使用我们不拥有的https服务器。)

包括

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

最后,我能够解决这个问题,内容types和请求格式完全不同于我传递的请求

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

所以差异是我必须通过与内容types的行动。

Soap Envelop的请求也与不同的命名空间完全不同

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

由于标题信息也完全不同,我们必须在那里指定动作。

希望对面临同样问题的人有帮助。