WSDL绑定样式各种组合优劣势比较

WSDL绑定样式各种组合优劣势比较

目前Web服务的相关标准是WSDL【Web服务描述语言】,一种标准的类似XML Schema的语言,用它来详细说明Web服务和SOAP【简单对象访问协议】Web服务使用的实际的沟通协议就是SOAP。WSDL 绑定样式由两个属性组合而成:style、use;style可以是RPC/Document,use可以是Encoded/Literal;下面解释下这4个名词的意思:

RPC 样式

RPC样式指定<soap:body> 元素包含一个将被调用的web方法的名称的元素(wrapper element(封装元素))。这个元素依次为该方法的每个参数还有返回值作了记录。

Document 样式

如果是document 样式,就没有像在RPC样式中的wrapper元素。转而代之的是消息片断直接出现在<soap:body> 元素之下。没有任何SOAP格式化规则规定<soap:body>元素下能包含什么;它包含的是一个发送者和接收者都达成一致的XML文档。

Encoded 编码 

如果use的值是encoded”, 则每个消息片段将使用类型属性来引用抽象类型。通过应用由 encodingStyle 属性所指定的编码样式,可使用这些抽象类型生成具体的消息。最常用到的SOAP编码样式是在SOAP1.1中定义的一组序列化规则,它说明了对象、结构、数组和图形对象应该如何序列化。通常,在应用程序中使用SOAP编码着重于远程进程调用和以后适合使用RPC消息样式。

Literal 文字? 

如果use 的值是Literal 则每个片段使用 element 属性(对于简单片段)或 type 属性(对于复合片段)来引用具体架构,例如,数据根据指定的架构来序列化,这架构通常使用W3C XML架构来表述。

根据不同的组合,形成了四种绑定模型;另外,还有一种用Document模拟RPC样式的包装组合也很常见;

  1. RPC/Encoded
  2. RPC/Literal
  3. Document/Encoded
  4. Document/Literal
  5. Document/Literal Wrapped

对于以上5种组合方式,由于Document/Encoded不被现有平台所支持,在实际中应用很少,所以这里就暂时不讨论该种组合;对于剩下的4种组合,我们结合一个表格和实例来对比下各自的优劣情况;

Binding Type Advantage/DisAdvantage
RPC/
Encoded
优点:
  1. WSDL文件的定义遵循直观和众所周知的远程进程调用的沟通模式。
  2. 操作名显示在消息中,因此接收者很容易就把消息分派给它的实现。
  3. 如果你正在你的服务中使用数据图形或者多态,这是惟一能使用的样式。

缺点:

  1. SOAP消息包含的类型编码信息就如xsi:type="xsd:int",这些就是一种开销。
  2. 通常验证SOAP消息是很困难的,因为在WSDL Shcema中没有描述。
  3. RPC样式引起了一种在服务提供者和客户之间的紧密耦合,任何对接口的更改都会导致服务和客户间联系的中断。
  4. 不被WSI一致性标准所支持。
RPC/
Literal

优点:

  1. WSDL定义仍然像RPC/Encoded样式一样简单直接。
  2. 操作名仍然出现在SOAP消息中。
  3. 把类型编码从消息中排除了,因此提升了吞吐性能。

缺点:

  1. 服务和客户之间仍然有紧密耦合。
  2. 仍然难以用SOAP消息来验证传输的数据。
  3. 它也不被WSI一致性标准所支持。 
Document/
Litaral

优点:

  1. SOAP消息中没有类型编码信息。
  2. 你总能用任何XML验证器来验证消息,在soap体中任何东西都在schema中有定义。
  3. 使用document样式,规则不是那么严格,还有对XML Schema进行增强和更改时不会破坏接口。
  4. 如果使用某特殊序列进行多进程调用,Document 样式可以保持应用程序的状态。
  5. Document样式更加适合异步处理。
  6. 许多document-messaging服务能够选择文档的DOMSAX 两种处理方式的其中一种,结果就是能最小化在内存中的处理。

缺点:

  1. WSDL定义变得更加复杂。
  2. SOAP消息中的操作名没有了,没有了名称,把消息分派给它的实现方法就变得困难或不可能了。 
Document/
Literal
Wrapped

优点:

  1. 包含了所有Document/Literal样式的优点。
  2. 操作名出现在SOAP消息中。

缺点:

  1. 即使WSDL定义变得更加复杂,但仍然有不少缺点。
  2. 如果你在web服务中重载了操作,你就不能使用该样式。 

假设我们需要调用的WS的method为:public void myMethod(int x); 各种绑定样式生成的WSDL/SOAP片段如下:

Binding Type WSDL SOAP
RPC/ Encoded
[xml] view plain copy
  1. <message name="myMethodRequest">  
  2.   
  3.     <part name="x" type="xsd:int" />  
  4.   
  5. </message>  
  6.   
  7. <message name="empty" />  
  8.   
  9. <portType name="PT">  
  10.   
  11.     <operation name="myMethod">  
  12.   
  13.         <input message="myMethodRequest" />  
  14.   
  15.         <output message="empty" />  
  16.   
  17.     </operation>  
  18.   
  19. </portType>  
  20.   
  21. <binding>  
  22.   
  23.     <!-- RPC/encoded. -->  
  24.   
  25. </binding>  
[xml] view plain copy
  1. <soap:envelope>  
  2.   
  3.     <soap:body>  
  4.   
  5.         <myMethod>  
  6.   
  7.             <x xsi:type="xsd:int">5</x>  
  8.   
  9.         </myMethod>  
  10.   
  11.     </soap:body>  
  12.   
  13. </soap:envelope>  
RPC/ Literal
[xml] view plain copy
  1. <message name="myMethodRequest">  
  2.   
  3.     <part name="x" type="xsd:int" />  
  4.   
  5. </message>  
  6.   
  7. <message name="empty" />  
  8.   
  9. <portType name="PT">  
  10.   
  11.     <operation name="myMethod">  
  12.   
  13.         <input message="myMethodRequest" />  
  14.   
  15.         <output message="empty" />  
  16.   
  17.     </operation>  
  18.   
  19. </portType>  
  20.   
  21. <binding>  
  22.   
  23.     <!-- RPC/literal. -->  
  24.   
  25. </binding>  
[xml] view plain copy
  1. <soap:envelope>  
  2.   
  3.     <soap:body>  
  4.   
  5.         <myMethod>  
  6.   
  7.             <x>5</x>  
  8.   
  9.         </myMethod>  
  10.   
  11.     </soap:body>  
  12.   
  13. </soap:envelope>  
Document/ Litaral
[xml] view plain copy
  1. <types>  
  2.   
  3.     <schema>  
  4.   
  5.         <element name="xElement" type="xsd:int" />  
  6.   
  7.     </schema>  
  8.   
  9. </types>  
  10.   
  11. <message name="myMethodRequest">  
  12.   
  13.     <part name="x" element="xElement" />  
  14.   
  15. </message>  
  16.   
  17. <message name="empty" />  
  18.   
  19. <portType name="PT">  
  20.   
  21.     <operation name="myMethod">  
  22.   
  23.         <input message="myMethodRequest" />  
  24.   
  25.         <output message="empty" />  
  26.   
  27.     </operation>  
  28.   
  29. </portType>  
  30.   
  31. <binding>  
  32.   
  33.     <!-- document/literal. -->  
  34.   
  35. </binding>  
[xml] view plain copy
  1. <soap:envelope>  
  2.   
  3.     <soap:body>  
  4.   
  5.         <xElement>5</xElement>  
  6.   
  7.     </soap:body>  
  8.   
  9. </soap:envelope>  
Document/ Literal Wrapped
[xml] view plain copy
  1. <types>  
  2.   
  3.     <schema>  
  4.   
  5.         <element name="myMethod" />  
  6.   
  7.         <complexType>  
  8.   
  9.             <sequence>  
  10.   
  11.                 <element name="x" type="xsd:int" />  
  12.   
  13.             </sequence>  
  14.   
  15.         </complexType>  
  16.   
  17.         </element>  
  18.   
  19.     </schema>  
  20.   
  21. </types>  
  22.   
  23. <message name="myMethodRequest">  
  24.   
  25.     <part name="parameters" element="myMethod" />  
  26.   
  27. </message>  
  28.   
  29. <message name="empty" />  
  30.   
  31. <portType name="PT">  
  32.   
  33.     <operation name="myMethod">  
  34.   
  35.         <input message="myMethodRequest" />  
  36.   
  37.         <output message="empty" />  
  38.   
  39.     </operation>  
  40.   
  41. </portType>  
  42.   
  43. <binding>  
  44.   
  45.     <!-- document/literal. -->  
  46.   
  47. </binding>  
[xml] view plain copy
  1. <soap:envelope>  
  2.   
  3.     <soap:body>  
  4.   
  5.         <myMethod>  
  6.   
  7.             <x>5</x>  
  8.   
  9.         </myMethod>  
  10.   
  11.     </soap:body>  
  12.  
  13. </soap:envelope> 


你可能感兴趣的:(WSDL绑定样式各种组合优劣势比较)