Um WSDL pode indicar a versão SOAP (1.1 ou 1.2) do serviço web?
é possível ver se um serviço web usa o SOAP 1.1 ou 1.2, com base nas informações do WSDL?
5 answers
O SOAP 1.1 usa espaços de nomes http://schemas.xmlsoap.org/wsdl/soap/
O SOAP 1.2 usa espaços de nomes http://schemas.xmlsoap.org/wsdl/soap12/
O wsdl é capaz de definir as operações sob o soap 1.1 e o soap 1.2 ao mesmo tempo no mesmo wsdl. Isso é útil se você precisar evoluir o seu wsdl para suportar uma nova funcionalidade que requer o soap 1.2 (eg. MTOM), neste caso você não precisa criar um novo serviço, mas apenas evoluir o original.
No WSDL, se olhar para a Secção de ligação, verá claramente que a ligação do sabão é explicitamente mencionada se o Serviço utilizar o Sabonetes 1.2. consulte a amostra abaixo.
<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>
Se o serviço web usar o soap 1.1, não irá definir explicitamente nenhuma versão soap no ficheiro WSDL sob a secção binding. consulte a amostra abaixo.
<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>
Como determinar a versão de sabão da mensagem de sabão?
Mas lembre-se que esta não é uma forma muito recomendada de determine a versão soap que seus serviços web usam. a versão da mensagem soap pode ser determinada usando uma das seguintes maneiras.
1. a verificar o espaço de nomes da mensagem soap
SOAP 1.1 namespace : http://schemas.xmlsoap.org/soap/envelope
SOAP 1.2 namespace : http://www.w3.org/2003/05/soap-envelope
2. verificar a informação de ligação ao transporte (Informação do cabeçalho http) da mensagem soap
SOAP 1.1: texto do utilizador / xml para o tipo de contexto
POST /MyService HTTP/1.1
Content-Type: text/xml; charset="utf-8"
Content-Length: xxx
SOAPAction: "urn:uuid:myaction"
SOAP 1.2: aplicação do utilizador / soap+xml para o tipo de contexto
POST /MyService HTTP/1.1
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: xxx
SOAPAction: "urn:uuid:myaction"
3. usar sabão informação sobre avarias
A estrutura de uma mensagem de falha de sabão entre as duas versões é diferente.Encontrei esta página
Http://schemas.xmlsoap.org/wsdl/soap12/soap12WSDL.htm
O que diz que o Soap 1.2 usa o novo espaço de nomes. http://schemas.xmlsoap.org/wsdl/soap12/Está na extensão de ligação wsdl 1.1 para o SOAP 1.1.
Sim, normalmente pode ver qual a versão do SOAP que é suportada com base no WSDL.
Dê uma olhada emDemo web service WSDL . Ele tem uma referência ao espaço de nomes soap12 indicando que suporta SOAP 1.2. Se isso estivesse ausente, provavelmente estaria seguro assumindo que o serviço só suportava sabão 1.1.
Encontrou o transport-atributo no binding-element que nos diz que este é o WSDL 1.1 binding para o SOAP 1.1 HTTP binding.
Ex.
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>