WSDL 能否指示 Web 服务的 SOAP 版本(1.1 或 1.2)?

Posted

技术标签:

【中文标题】WSDL 能否指示 Web 服务的 SOAP 版本(1.1 或 1.2)?【英文标题】:Can a WSDL indicate the SOAP version (1.1 or 1.2) of the web service? 【发布时间】:2010-10-18 17:18:37 【问题描述】:

是否可以根据 WSDL 中的信息查看 Web 服务使用的是 SOAP 1.1 还是 1.2?

【问题讨论】:

【参考方案1】:

SOAP 1.1 使用命名空间http://schemas.xmlsoap.org/wsdl/soap/

SOAP 1.2 使用命名空间http://schemas.xmlsoap.org/wsdl/soap12/

wsdl 可以在同一个wsdl 中同时定义soap 1.1 和soap 1.2 下的操作。如果您需要改进 wsdl 以支持需要 soap 1.2 的新功能(例如 MTOM),这很有用,在这种情况下,您不需要创建新服务,只需改进原始服务即可。

【讨论】:

MTOM 可以和soap1.1一起使用【参考方案2】:

在 WSDL 中,如果您查看 Binding 部分,您会清楚地看到,如果服务使用的是 soap 1.2,则明确提到了 soap 绑定。请参考以下示例。

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

如果Web 服务使用soap 1.1,它不会在绑定部分的WSDL 文件中明确定义任何soap 版本。请参考以下示例。

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

如何确定 SOAP 消息的 SOAP 版本?

但请记住,这不是很推荐的方法来确定您的 Web 服务使用的 soap 版本。可以使用以下方法之一确定soap消息的版本。

1.检查soap消息的命名空间

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

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

2。检查soap消息的传输绑定信息(http头信息)

SOAP 1.1:上下文类型的用户文本/xml

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

SOAP 1.2:上下文类型的用户应用程序/soap+xml

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

3.使用 SOAP 错误信息

两个版本之间的 SOAP 错误消息的结构不同。

【讨论】:

您的答案的第一部分可能会使用一些附加信息 - “soap12”是命名空间前缀,而不是命名空间本身。您需要检查“soap12”前缀解析为什么,以及指定的soap 版本。有人可以使用soap12 作为前缀,但指向soap11 命名空间URI。 谢谢你,这很有用。 @csadler 的评论非常重要,但即便如此,也没有提供正确的命名空间值。给你。引用 1.1 的 soap 前缀是 http://schemas.xmlsoap.org/wsdl/soap/。引用 1.2 的 soap12 前缀是 http://schemas.xmlsoap.org/wsdl/soap12/。无论前缀名称是什么(甚至可以是foobar),只要看看它解析的是什么命名空间。【参考方案3】:

我找到了这个页面

http://schemas.xmlsoap.org/wsdl/soap12/soap12WSDL.htm

这表示 Soap 1.2 使用新的命名空间 http://schemas.xmlsoap.org/wsdl/soap12/

它位于“SOAP 1.1 的 WSDL 1.1 绑定扩展”中。

【讨论】:

【参考方案4】:

是的,您通常可以根据 WSDL 查看支持的 SOAP 版本。

看看Demo web service WSDL。它有一个对 soap12 命名空间的引用,表明它支持 SOAP 1.2。如果不存在,那么假设该服务仅支持 SOAP 1.1,您可能是安全的。

【讨论】:

soap12 命名空间引用是一个很好的指标。但如果它丢失了,它仍然可以是 SOAP 1.2 Web 服务 - en.wikipedia.org/wiki/Web_Services_Description_Language als 的示例 WSDL 没有此引用,但它可能包含 SOAP 1.2 典型的其他内容?【参考方案5】:

在 binding-element 中找到了 transport-attribute,它告诉我们这是 SOAP 1.1 HTTP 绑定的 WSDL 1.1 绑定。

例如

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

【讨论】:

以上是关于WSDL 能否指示 Web 服务的 SOAP 版本(1.1 或 1.2)?的主要内容,如果未能解决你的问题,请参考以下文章

WSDL 的 SalesForce Web 服务 - 无效的登录 SOAP 错误

如何从命令行调用 SOAP wsdl Web 服务

REST Web 服务 WSDL? [复制]

web服务器:SOAP,WSDL,UDDI

使用 Oracle 10 中具有复杂类型的 SOAP Web 服务 WSDL

SOAP/WSDL/XSD 和 REST 方法之间的比较