2013-05-08 17 views
6

Ottenere seguente errore consumando SOAP webservice in iOS App"Nessuna intestazione d'azione è stato trovato" messaggio di errore durante l'uso di SOAP webservice

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

Lo stesso webservice lavorando bene in SOAP UI Tool.

seguito è il formato della richiesta

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

completa risposta di errore ricevuta dal 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> 

Qualsiasi aiuto molto apprezzato.

risposta

10

Abbiamo avuto lo stesso problema con un server basato su ASP.NET (messaggio di errore quando si utilizza python/suds, la stessa query funzionava in SoapUi); dopo un sacco di ricerche, abbiamo scoperto che è necessario aggiungere un'intestazione SOAP (come elemento XML) che contiene l'azione; avere l'azione nelle intestazioni Content-Type o SOAPAction non era sufficiente (ma non danneggia neanche). Ecco un esempio di una query di successo (da 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> 

Con Python e SUDS, questo è come l'abbiamo fatto:

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

L'azione può essere interrogato dal metodo, cioè se si vogliamo chiamare un metodo client.service.foo, utilizziamo

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

Abbiamo trovato questo, cercando in registro HTTP SoapUI. (Abbiamo anche provato Wireshark, ma non funzionava perché stiamo cercando di utilizzare un server https che non possediamo.)

+0

Se stai usando la gemma Savon in Ruby, prova a impostare l'opzione 'use_wsa_headers' su' true' – aidan

0

Includere

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

Ciao Lithu TV grazie per la risposta, ma in realtà non funziona e per questa risposta di tipo di contenuto è zero. – prasad

0

Finalmente ho in grado di risolvere questo problema, il tipo di contenuto e formato di richiesta sono totalmente diverso da quello che sto passando con richiesta

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

Così differenza è che devo passare l'azione con il tipo di contenuto.

anche la richiesta di sapone avvolge è totalmente diverso con diversi spazi dei nomi

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

Come le informazioni di intestazione è anche totalmente diverso dobbiamo specificare l'azione laggiù.

Spero che possa essere utile a qualcuno che si trova di fronte allo stesso problema.

Problemi correlati