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.
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
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? –