WSDL 中的 <binding> 和 <portType> 有啥区别?

Posted

技术标签:

【中文标题】WSDL 中的 <binding> 和 <portType> 有啥区别?【英文标题】:What's the difference between <binding> and <portType> in WSDL?WSDL 中的 <binding> 和 <portType> 有什么区别? 【发布时间】:2011-05-29 12:31:12 【问题描述】:

&lt;binding&gt;&lt;portType&gt; 似乎都定义了一个操作及其消息。我不太明白,为什么它们都是必需的?

【问题讨论】:

这是一个很好的问题,我认为下面的任何答案似乎都没有解决这个问题。仅当存在多对多关系时,区分它们才有意义,当 标记只能引用一个 portType 时,这似乎是不可能的。可能有历史原因,而不是实际原因。 【参考方案1】:

PortType 定义了 Web 服务的抽象接口。 从概念上讲,它就像一个 Java 接口,因为它定义了一个抽象类型和相关方法。 在 WSDL 中,端口类型由绑定和服务元素实现,这些元素指示Web 服务实现要使用的协议、编码方案等 IE。绑定指定了具体的实现细节,并且本质上将 portType 映射到一组协议(HTTP 和 SOAP)消息样式(文档/RPC)和编码(文字) 现在区分清楚了吗?

【讨论】:

第 1 行是否应该阅读“端口类型定义 Web 服务的抽象接口”?【参考方案2】:

接口 (wsdl:portType)

WSDL portType 元素定义了一组操作(有时称为接口)。

操作元素包含输入和输出元素的组合。当您有输出元素时,可能存在故障元素。这些元素的顺序定义了消息交换模式 (MEP)(单向、请求 - 响应等)

wsdl:binding

WSDL 绑定元素描述了将特定端口类型与给定协议一起使用的具体细节。

【讨论】:

你也可以引用你的来源:msdn.microsoft.com/en-us/library/ms996486.aspx【参考方案3】:

端口类型单个 Web 服务可以支持许多不同的协议。数据的结构取决于您用来调用 Web 服务的协议。因此,您需要一种方法将操作映射到可以访问它们的端点portType 元素负责此映射。

您可以为该 Web 服务可用的每个协议放置一个 portType 定义。例如,您可以为使用 SOAP、HTTP-POST 和 HTTP-GET 定义单独的 portType。操作名称是 Web 服务中可用的方法。

绑定 您可以定义最终用户如何绑定到可获取操作的端口。您可以通过使用元素来做到这一点。

【讨论】:

【参考方案4】:

portType(类似于 Java 接口)

PortType 是 WSDL 的抽象部分。 一个或多个端点支持的一组抽象操作。

绑定

绑定是 WSDL 的一个具体部分。 通过为操作和消息指定具体的协议和数据格式规范来描述如何调用操作。

bindings are three types

    SOAP Binding: SOAP 绑定允许document or rpc style 与encodingliteralEncoding 指示数据值应如何以 XML 格式编码(这些规则指定如何将“某物”编码/序列化为 XML,然后再从 XML 解码/反序列化为“某物”) . Literal 表示数据是根据模式序列化的(这只是普通的 XML 数据)。带传输类型http、jms、smtp...

    HTTP GET & POST binding: WSDL 包括 HTTP 1.1 的 GET 和 POST 动词的绑定,以便描述 Web 浏览器和网站之间的交互。

    MIME binding: WSDL 包括一种将抽象类型绑定到某种 MIME 格式的具体消息的方法。


在 WSDL 2.0 中:

PortTypes 重命名为接口 端口重命名为端点 删除了消息结构

Source


有用的链接

WSDL Reading, a Beginner's Guide W3C: Web Services Description Language (WSDL) 1.1 W3C: Simple Object Access Protocol (SOAP) 1.1

【讨论】:

【参考方案5】:

wsdl:portType 与 wsdl:operation 一起使用 即,我们处于消息和 xml 领域中

但是 wsdl:binding 与 soap:binding 和 soap:operation 一起使用 也就是说,我们处于编码、地址、标头和 rpc 领域

例如来自:http://www.w3.org/TR/wsdl#_soap-b

 <binding name="StockQuoteSoap" type="tns:StockQuotePortType">
        <soap:binding style="document" transport="http://example.com/smtp"/>
        <operation name="SubscribeToQuotes">
           <input message="tns:SubscribeToQuotes">
               <soap:body parts="body" use="literal"/>
               <soap:header message="tns:SubscribeToQuotes" part="subscribeheader" use="literal"/>

.....

<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="GetTradePrice">
       <soap:operation soapAction="http://example.com/GetTradePrice"/>
       <input>
           <soap:body use="encoded" namespace="http://example.com/stockquote"
                      encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

...

从第 3.2 段开始,所有可能的低级通信细节:

SOAP 绑定使用以下扩展元素扩展 WSDL:

<definitions .... >
    <binding .... >
        <soap:binding style="rpc|document" transport="uri">
        <operation .... >
           <soap:operation soapAction="uri"? style="rpc|document"?>?
           <input>
               <soap:body parts="nmtokens"? use="literal|encoded"
                          encodingStyle="uri-list"? namespace="uri"?>
               <soap:header message="qname" part="nmtoken" use="literal|encoded"
                            encodingStyle="uri-list"? namespace="uri"?>*
                 <soap:headerfault message="qname" part="nmtoken" use="literal|encoded"
                                   encodingStyle="uri-list"? namespace="uri"?/>*
               <soap:header>                                
           </input>
           <output>
               <soap:body parts="nmtokens"? use="literal|encoded"
                          encodingStyle="uri-list"? namespace="uri"?>
               <soap:header message="qname" part="nmtoken" use="literal|encoded"
                            encodingStyle="uri-list"? namespace="uri"?>*
                 <soap:headerfault message="qname" part="nmtoken" use="literal|encoded"
                                   encodingStyle="uri-list"? namespace="uri"?/>*
               <soap:header>                                
           </output>
           <fault>*
               <soap:fault name="nmtoken" use="literal|encoded"
                           encodingStyle="uri-list"? namespace="uri"?>
            </fault>
        </operation>
    </binding>

    <port .... >
        <soap:address location="uri"/> 
    </port>
</definitions>

【讨论】:

以上是关于WSDL 中的 <binding> 和 <portType> 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

WSDL(WebService描述语言)文件介绍

无法导入 wsdl:portType、wsdl:binding、wsdl:port

为什么我的WSDL仍然显示基本的http绑定与http的位置值?

为啥 Visual Studio 生成的 WSDL 未指定 soap:operation 元素(缺少 wsdl:binding 元素)

WSDL 中的 targetNamespace 和命名空间

想要在没有App.config的C#客户端中使用WSDL Web服务(但是通过代码)