在WSDL中,<binding>和<portType>之间有什么区别?

57

无论是<binding>还是<portType>都似乎定义了一个操作及其消息。我不太明白,为什么它们都是必需的?


4
这是一个好问题,我认为下面的任何答案似乎都没有涉及它。只有在存在多对多关系时,区分它们才有意义,但当<binding>标记只能引用一个portType时,这似乎是不可能的。这可能是由于历史原因而非实际原因造成的。 - Jason K.
5个回答

39

portType(类似于Java接口)

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

binding

  • 绑定是 WSDL 的具体部分。
  • 描述了如何通过为操作和消息指定具体的协议和数据格式规范来调用操作。
  • 绑定有三种类型

    1. SOAP 绑定:
      SOAP 绑定允许使用 documentrpc 样式,并且可以使用 encodingliteralEncoding 表示如何将数据值编码为 XML 格式(这些规则指定如何将“某物”编码/序列化为 XML,然后再从 XML 解码/反序列化为“某物”)。 Literal 意味着根据模式对数据进行序列化(这只是普通的 XML 数据)。使用的传输类型为 http、jms、smtp 等。

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

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


enter image description here

在WSDL 2.0中:
  • PortTypes被重命名为接口
  • Ports被重命名为端点
  • 移除了消息构造

来源


有用的链接


26

接口(wsdl:portType)

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

操作元素包含输入和输出元素的组合。当您有一个输出元素时,可以使用fault元素。这些元素的顺序定义了消息交换模式(MEP)(单向,请求-响应等)

图像描述

wsdl:binding

WSDL的binding元素描述了使用给定协议与特定portType的具体细节。

图像描述


3
你也可以引用你的来源: https://msdn.microsoft.com/en-us/library/ms996486.aspx - logi-kal

12

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


7
第一行是否应该改为“端口类型定义了 Web 服务的抽象接口”? - Neil Stevens

5

portType
一个Web服务可以支持多种不同的协议。数据的结构取决于你用来调用Web服务的协议。因此,你需要一种方法来从操作映射到可以访问它们的终端节点。这就是portType元素所处理的映射问题。

你可以为该Web服务中可用的每个协议放置一个portType定义。例如,你可以有适用于SOAP、HTTP-POST和HTTP-GET使用的各自的portType定义。操作名称是Web服务提供的方法。

binding
你可以通过使用binding元素来定义最终用户如何绑定到可以获得操作的端口。


2

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接