綁定
目標
- 理解綁定和它的行為是什么,在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除了它使用文本消息編碼和開啟了事務流之外。
