Kann eine WSDL die SOAP-Version (1.1 oder 1.2) des Webdienstes angeben?

78

Kann anhand der Informationen in der WSDL festgestellt werden, ob ein Webdienst SOAP 1.1 oder 1.2 verwendet?

mjn
quelle

Antworten:

71

SOAP 1.1 verwendet den Namespace http://schemas.xmlsoap.org/wsdl/soap/

SOAP 1.2 verwendet den Namespace http://schemas.xmlsoap.org/wsdl/soap12/

Die WSDL kann Operationen unter Seife 1.1 und Seife 1.2 gleichzeitig in derselben WSDL definieren. Dies ist nützlich, wenn Sie Ihre WSDL weiterentwickeln müssen, um neue Funktionen zu unterstützen, für die Seife 1.2 (z. B. MTOM) erforderlich ist. In diesem Fall müssen Sie keinen neuen Dienst erstellen, sondern nur den ursprünglichen weiterentwickeln.

jmhostalet
quelle
3
MTOM kann mit soap1.1
GregD
40

Wenn Sie sich in WSDL den Abschnitt Bindung ansehen , werden Sie deutlich sehen, dass die Seifenbindung ausdrücklich erwähnt wird, wenn der Dienst Seife 1.2 verwendet. Siehe das folgende Beispiel.

<binding name="EmployeeServiceImplPortBinding" type="tns:EmployeeServiceImpl">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="findEmployeeById">
    <soap12:operation soapAction=""/>
    <input><soap12:body use="literal"/></input>
    <output><soap12:body use="literal"/></output>
</operation><operation name="create">
    <soap12:operation soapAction=""/>
    <input><soap12:body use="literal"/></input>
    <output><soap12:body use="literal"/></output>
</operation>
</binding>

Wenn der Webdienst Seife 1.1 verwendet, definiert er keine Seifenversion in der WSDL-Datei unter dem Bindungsabschnitt explizit. Beziehen Sie sich auf das folgende Beispiel.

<binding name="EmployeeServiceImplPortBinding" type="tns:EmployeeServiceImpl">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="rpc"/>
<operation name="findEmployeeById">
    <soap:operation soapAction=""/>
    <input><soap:body use="literal" namespace="http://jaxb.ws.jax.samples.chathurangaonline.com/"/></input>
    <output><soap:body use="literal" namespace="http://jaxb.ws.jax.samples.chathurangaonline.com/"/></output>
</operation><operation name="create">
    <soap:operation soapAction=""/>
    <input><soap:body use="literal" namespace="http://jaxb.ws.jax.samples.chathurangaonline.com/"/></input>
    <output><soap:body use="literal" namespace="http://jaxb.ws.jax.samples.chathurangaonline.com/"/></output>
</operation>
</binding>

Wie bestimme ich die SOAP-Version der SOAP-Nachricht?

Denken Sie jedoch daran, dass dies keine sehr empfohlene Methode ist, um die von Ihren Webdiensten verwendete Seifenversion zu bestimmen. Die Version der Seifennachricht kann auf eine der folgenden Arten bestimmt werden.

1. Überprüfen Sie den Namespace der Seifennachricht

SOAP 1.1  namespace : http://schemas.xmlsoap.org/soap/envelope

SOAP 1.2 namespace  : http://www.w3.org/2003/05/soap-envelope

2. Überprüfen der Transportbindungsinformationen (http-Headerinformationen) der Seifennachricht

SOAP 1.1: Benutzertext / XML für den Kontexttyp

   POST /MyService HTTP/1.1
   Content-Type: text/xml; charset="utf-8"
   Content-Length: xxx
   SOAPAction: "urn:uuid:myaction"

SOAP 1.2: Benutzeranwendung / soap + xml für den Kontexttyp

   POST /MyService HTTP/1.1
   Content-Type: application/soap+xml; charset="utf-8"
   Content-Length: xxx
   SOAPAction: "urn:uuid:myaction"

3. Verwenden von SOAP-Fehlerinformationen

Die Struktur einer SOAP-Fehlermeldung zwischen den beiden Versionen ist unterschiedlich.

Chathuranga Tennakoon
quelle
18
Der erste Teil Ihrer Antwort könnte einige zusätzliche Informationen enthalten - die "soap12" ist das Namespace-Präfix, nicht der Namespace selbst. Sie müssen überprüfen, in was das Präfix "soap12" aufgelöst wird und welche Seifenversion angegeben ist. Jemand könnte soap12 als Präfix verwenden, aber auf den URI des soap11-Namespace verweisen.
Csadler
Danke, das war so nützlich.
Wikingersteve
1
Der Kommentar von @csadler ist äußerst wichtig, aber selbst dort werden keine korrekten Werte für Namespaces angegeben. Hier sind Sie ja. Das soapPräfix, das sich auf 1.1 bezieht, lautet http://schemas.xmlsoap.org/wsdl/soap/. Das soap12Präfix, das sich auf 1.2 bezieht, lautet http://schemas.xmlsoap.org/wsdl/soap12/. Was auch immer der Präfixname ist (könnte gerade foooder sein bar), schauen Sie sich einfach an, welchen Namespace er auflöst.
Wiktor Zychla
4

Ja, Sie können normalerweise sehen, welche SOAP-Version basierend auf der WSDL unterstützt wird.

Schauen Sie sich den Demo-Webdienst WSDL an . Es enthält einen Verweis auf den Namespace soap12, der angibt, dass SOAP 1.2 unterstützt wird. Wenn dies nicht der Fall wäre, wären Sie wahrscheinlich sicher, wenn der Dienst nur SOAP 1.1 unterstützt.

Aaron Clauson
quelle
Die Seife12-Namespace-Referenz ist ein guter Indikator. Wenn es jedoch fehlt, kann es sich dennoch um einen SOAP 1.2-Webdienst handeln - das Beispiel WSDL unter en.wikipedia.org/wiki/Web_Services_Description_Language enthält ebenfalls keine Referenz, enthält jedoch möglicherweise etwas anderes, das für SOAP 1.2 typisch ist?
mjn
2

Transport-Attribut im Bindungselement gefunden, das uns sagt, dass dies die WSDL 1.1-Bindung für die SOAP 1.1-HTTP-Bindung ist.

Ex.

<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
LilleElefant
quelle