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

转自:http://blog.csdn.net/sfdev/archive/2008/06/12/2540703.aspx


目前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 TypeAdvantage/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 TypeWSDLSOAP
RPC/ Encoded
  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 >   
  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
  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 >   
  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
  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 >   
  1. < soap:envelope >   
  2.   
  3.     < soap:body >   
  4.   
  5.         < xElement > 5 </ xElement >   
  6.   
  7.     </ soap:body >   
  8.   
  9. </ soap:envelope >   
Document/ Literal Wrapped
  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 >   
  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 >   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值