绑定
目标
- 理解绑定和它的行为是什么,在WCF怎样使用
- 理解什么时候使用什么绑定
- 理解什么绑定最适合Internet (互联网)
- 理解什么绑定最适合Intranet (局域网)
如何选择绑定
- 如果需要支持通过互联网访问的客户端,建议使用wsHttpBinding
- 如果需要支持传统的客户端如ASMX Web服务,建议使用basicHttpBinding
- 如果需要支持局域网内的WCF客户端,建议使用netTcpBinding
- 如果需要支持同一台机器上的WCF客户端,建议使用netNamedPipeBinding
- 如果需要支持断开队列调用,建议使用netMsmqBinding
- 如果需要支持在客户端和服务器端双向通信,建议使用wsDualHttpBinding或netTcpBinding
综述
WCF是一个建立服务的框架,允许你使用不同的传送协议和不同的XML表示来传送消息。增强了与SOAP协议的交互。WCF通过信道来处理所有通信细节。
从头构建一个信道是一个挑战,就像你决定订购组件是否相互兼容。由于这个原因,WCF在可配置的终端的帮助下来间接配置底下的信道。 一个终端(endpoint)指定了地址,绑定方式和契约。地址指定了你想要监听消息的网络地址;契约指定了在指定地址中包含什么消息;绑定了提供处理消息的信道。当加载一个服务时,WCF通过绑定描述中的指令构建了信道。
WCF内建绑定
绑定定义了客户端如何与你的服务进行连接和通信。所有的WCF绑定都是通过System.ServiceModel.Channels.Binding类来表示,它是所有绑定的基类。每一个绑定类通过它的实现定义了一个不同的信道配置。绑定包含了使用的WS-*协议的定义,消息的编码及传输协议。
WCF为一些常见的场景产生了一组可配置的绑定。如果没有合适的,可以创建自定义绑定来显式地配置你的服务来满足要求。
下表示常用的绑定
Bdinging | Description |
basicHttpBinding | 可以配置成一个能与基于ASMX Web服务的或者遵循WS-I Basic Profile 1.1规范的客户端或其它服务通信的绑定。默认,basicHttpBindg没有安全。 |
wsHttpBinding | 定义了一个安全的,可靠的,协作的绑定,适用于非双工的服务契约。这个绑定实现了以下规范:可靠的WS消息,WS安全和认证。传送协议是HTTP,消息编码是text/XML。默认,它提供使用Windows认证的消息安全。 |
ws2007HttpBinding | 定义了一个安全的,可靠的,协作的绑定,适用于非双工的服务契约。这个绑定实现了以下规范:可靠的WS消息,WS安全和认证。传送协议是HTTP,消息编码是text/XML。它提供了类似与wsHttpBinding,但是使用标准的OASIS()。默认,它提供使用Windows认证的消息安全。 |
netTcpBinding | 一个安全,可靠,优化的绑定,适用于跨机器使用。默认,它产生一个运行时通信栈带有传输安全和默认的Windows认证。使用TCP来消息传递和二进制消息编码。 |
netNamedPipeBinding | 一个安全,可靠,优化的绑定,适用同一个电脑上的跨进程通信。默认,它产生一个带有WS可靠消息的运行时通信栈,传输层安全,命名管道用于消息传递和二进制流编码。默认不是安全的。 |
netMsmqBinding | 一个适用于跨机器通信的队列绑定。 |
wsFederationHttpBinding | 支持联邦安全的绑定。跨多个企业或信任域进行认证和授权。WCF实现它是通过消息和混合的安全模型,但是不是传输层安全。使用这个绑定的服务,必须使用HTTP协议作为传输协议。 |
ws2007FederationHttpBinding | 派生自五四FederationHttpBinding,支持联邦安全。它类似于上面的绑定,但是它使用OASIS标准。 |
wsDualHttpBinding | 一个安全,可靠,协作的绑定,适用于双工服务契约或通过SOAP中间层进行通信的服务。 |
customBingind | 自定义绑定,完全控制消息栈。 |
关于更多绑定的信息,请看“Windows Communication Foundation Bindings”。
绑定行为和终端--Bindings Behaviors and Endpoints
WCF的终端由地址(Address),绑定(Binding)和契约(Contract)组成,简称ABC。绑定定义了客户端如何与服务器端连接和通信。绑定包含所使用的协议,消息编码方式和传输协议。举个例子,wsHttpBinding使用HTTP协议,XML1.0的编码及默认的消息安全和可靠会话及事务。绑定是通过包含绑定加上一个客户端可以发送消息的URI的服务终端来暴露的。绑定可以通过代码或配置文件中的元素来配置。
下面代码演示了使用传输安全来配置wsHttpBinding:
<bindings> <wsHttpBinding> <binding name="wsHttpEndpointBinding"> <security mode="Transport" /> </binding> </wsHttpBinding> </bindings>
下面的片断演示了使用一个终端来暴露这个绑定:
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" name="wsHttpEndpoint" contract="IService">
当为服务创建一个总的安全策略,应该使用绑定和行为来配置服务,如下:
- Bindings - 控制安全模型,客户端信任类型和其它安全设置。
- Behaviors - 控制行为,客户信任如何被授权和认证,和服务信任。
绑定元素
WCF提供了大量的通道和编码可用于预定义绑定。可以使用这些通道来提供用于自定义绑定中的绑定元素。binding元素是一个派生自System.ServiceModel.Channels.BindingElement的类。
WCF提供了不同绑定元素清单,包括绑定协议元素,消息编码元素,传输安全元素和传输元素。
协议绑定元素 - Protocol Binding Elements
Protocol | Class | Element |
Transaction Flow | TransactionFlowBindingElement | <transactionFlow /> |
Reliable Messaging | ReliableSessionBindingElement | <reliableSession /> |
Security | SecurityBindingElement | <security /> |
消息编码绑定元素 - Message Encoding Binding Elements
Message encoding | Class | Element |
Text | TextMessageEncodingBindingElement | <textMessageEncoding /> |
MTOM | MtomMessageEncodingBindingElement | <mtomMessageEncoding /> |
Binary | BinaryMessageEncodingBindingElement | <binaryMessageEncoding /> |
传输安全绑定元素 - Transport Security Binding Elements
Transport security | Class | Element |
Windows | WindowsStreamSecurityBindingElement | <windowStreamSecurity /> |
SSL | SslStreamSecurityBindingElement | <sslStreamSecurity /> |
传输绑定元素 - Transport Binding Elements
Transport | Class | Element |
HTTP | HttpTransportBindingElement | <httpTransport /> |
HTTPS | HttpsTransportBindingElement | <httpsTransport /> |
TCP | TcpTransportBindingElement | <tcpTransport /> |
Named pipes | NamedPipeTransportBindingElement | <namedPipeTransport /> |
MSMQ | MsmqTransportBindingElement | <msmqTransport /> |
MSMQ | MsmqIntegrationBindingElement | <msmqIntegration /> |
P2P | PeerTransportBindingElement | <peerTransport /> |
可以通过添加需要的BingdingElement到它的元素集合中来添加绑定元素。绑定元素添加的顺序是非常重要的。添加的顺序应该像下面一样:
- Transaction Flow (不必需)
- Reliable Messaging (不必需)
- Message Security (不必需)
- Composite Duplex (不必需)
- Message Encoding (必须)
- Transport Security (不必需)
- Transport (必须)
在自定义绑定中,Transport绑定元素是唯一必须的元素。对于每一个绑定Message Encoding元素是需要的,但是,如果没有指定,则WCF将添加一个默认的编码。HTTP(S)默认编码是文本,对于其它的传输编码是二进制。
下面代码演示了如何创建一个自定义绑定:
CustomBinding myHttpBinding = new CustomBinding(); myHttpBinding.Name="myHttpBinding"; myHttpBinding.Elements.Add(new HttpTransportBindingElement()); host.AddServiceEndpoint(typeof(IChart),myHttpBinding,"http://localhost:8080/char/custom");
下面代码演示了如何使用customBinding元素来创建一个自定义绑定:
<bindings> <customBinding> <binding name="myHttpBindingConfiguration"> <textMessageEncoding messageVersion="Soap11WSAddressingAugust2004" /> <httpTransport useDefaultWebProxy="true" transferMode="Streamed" /> </binding> </customBinding> </bindings>
自定义绑定配置示例
下面例子演示了自定义绑定执行函数类似于wsHttpBinding和netTcpBinding:
<system.serviceModel> … <bindings> <customBinding> <binding name=”myWSHttpBindingConfiguration”> <transactionFlow/> <reliableSession ordered=”true”/> <security authenticationMode=”SspiNegotiated”/> <binaryMessageEncoding/> <httpTransport/> </binding> <binding name=”myNetTcpBindingConfiguration”> <transactionFlow/> <textMessageEncoding/> <windowsStreamSecurity/> <tcpTransport/> </binding> </customBinding> </bindings> … </system.serviceModel> </configuration>
myWSHttpBindingConfiguration配置类似于内建的wsHttpBinding,除了它使用二进制消息编码和开启了事务流及有序的可靠的消息之外。myNetTcpBindingConfiguration配置类似于netTcpBinding除了它使用文本消息编码和开启了事务流之外。