2012-03-27 6 views
0

Wir haben einen .NET WCF-Dienst, der mit einer iPhone App kommuniziert. Ich verwende wsdl2objc, um den Objc-Code zu generieren, der für die gesamte SOAP-Magie benötigt wird. SoapUI ist in der Lage, die WSDL dieses Dienstes hinzuzufügen und Anforderungen korrekt zu senden. Aber die von wsdl2objc erzeugte Anfrage beschwert sich über diese:wsdl2objc: ContractFilter stimmt nicht mit dem EndpointDispatcher überein

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"> 
    <s:Body> 
     <s:Fault> 
      <s:Code> 
       <s:Value>s:Sender</s:Value> 
       <s:Subcode> 
        <s:Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</s:Value> 
       </s:Subcode> 
      </s:Code> 
      <s:Reason> 
       <s:Text xml:lang="en-US">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None). 
       </s:Text> 
      </s:Reason> 
     </s:Fault> 
    </s:Body> 
</s:Envelope> 

Wenn ich jedoch die gleiche s:Envelope mit SoapUI verwenden, die Anforderung richtig funktioniert. Der einzige Unterschied zwischen den beiden Anfragen, soweit ich sehen kann, ist der Header-Abschnitt, wo wsdl2objc generiert diese:

SOAPAction:http://xx/AuthenticateDevice

aber soapUI erzeugt:

Content-Type: application/soap+xml;charset=UTF-8;action="http://xx/AuthenticateDevice"

Ich habe versucht, den Code zu ändern dass wsdl2objc erzeugt und ersetzt diese:

[request setValue:soapAction forHTTPHeaderField:@"SOAPAction"]; 
NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8;"]; 
[request setValue:contentType forHTTPHeaderField:@"Content-Type"]; 

mit diesem:

[request setValue:soapAction forHTTPHeaderField:@"action"]; 
NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8;"]; 
[request setValue:contentType forHTTPHeaderField:@"Content-Type"]; 

Aber ich bekomme jetzt nur einen 400 Fehler. Jede Hilfe wird sehr geschätzt!

Danke,
Teja.

+0

In Ihren Beispielen zeigen Sie den Code, der den Wert von 'contentType' festlegt. Kannst du den Code zeigen, der den Wert von soapAction setzt? – pmartin

+0

SoapUI legte aus irgendeinem Grund die soapAction auf den Inhaltstyp-Header an. Ich schreibe eine Antwort darauf, wie ich es zur Arbeit bringen könnte, aber ich bin mir ziemlich sicher, dass es nicht der richtige Weg war. Kannst du einen Blick darauf werfen und etwas Besseres vorschlagen? –

Antwort

0

Es scheint, dass ich Anfang Zitat und Ende Zitat Tags um den Aktionswert fehlt, der dies verursacht hat. Hier ist der Code, der für mich arbeitete, aber ich bin nicht glücklich mit der action als Teil des http content-type Header. Also, wenn jemand mit einer besseren Lösung kommen kann, würde ich glücklich sein, Kredit zu geben:

NSString *contentType = [NSString stringWithFormat:@"application/soap+xml; charset=utf-8; action=\"%@\"", soapAction]; 
[request setValue:contentType forHTTPHeaderField:@"Content-Type"]; 
0

In den WCF-Dienste, die ich mit denen ich gearbeitet habe habe gerade den übergebenen Wert "text/xml" im Content-Type Header und dann hat den korrekten Wert für die Soap-Aktion in einem separaten Header SOAPAction übergeben (ähnlich wie wsdl2objc es tat).

Hier sind ein paar Dinge zu überprüfen:

  1. Ihre WCF-Dienst Ist Basichttpbinding mit - oder etwas anderes. (Ich erinnere mich, dass ich gelesen habe, dass andere Bindings als basicHttpBinding nicht gut (oder überhaupt) mit iOS funktionieren - aber ich bin mir nicht sicher)
  2. Was ist der korrekte SOAP-Aktionswert für diesen Dienst? Bei den Dienstleistungen, die ich mit ihm arbeiten gebaut ist mit <ServiceNamespace>\<WCFInterfaceName>\<MethodName>
1

Ich hatte ein ähnliches Problem, das durch Ändern des Umschlags Schema URL in der wsdl2objc Ausgabe

ich diesen

xmlNsPtr soapEnvelopeNs = xmlNewNs(root, (const  xmlChar*)"http://www.w3.org/2003/05/soap-envelope", (const xmlChar*)"soap"); 

zu Das änderte wurde behoben :

xmlNsPtr soapEnvelopeNs = xmlNewNs(root, (const xmlChar*)"http://schemas.xmlsoap.org/soap/envelope/", (const xmlChar*)"soap"); 

und es schien meine WCF Web-Service-Anrufe von iOS zu beheben.

Was ich denke, das bedeutet, dass meine Version von wsdl2objc eine SOAP 1.1 Hülle ausgibt, wenn der WCF-Server diese SOAP 1.2

Hat jemand bemerkt, scheint zu wollen? Gibt es eine andere Möglichkeit, dies zu konfigurieren, als sich nach dem Generieren des Codes zu ändern?

+0

Willkommen bei Stack Overflow. Der letzte Absatz wäre besser für eine neue Frage geeignet (mit einem Link zu diesem Kontext). Ansonsten, gute Antwort. – michaelb958

Verwandte Themen