WCF從理論到實踐(5):Binding細解
系列文章導航:
WCF從理論到實踐(16):操作重載(帶視頻+ppt+源碼)
WCF從理論到實踐(17):OO大背離(帶視頻+ppt+源碼)
本文的出發點:
通過閱讀本文,您能了解以下知識:
- WCF中的Binding是什么?
- Binding的組成?
- Binding Element 的分類?
- Binding描述了那些層面的信息?
- 選擇正確的Binding
本文適合的讀者:
本文適合WCF的初學者
WCF中的Binding是什么?
在弄清Binding是什么之前,我們先看一下WCF的中的Endpoint結構,一個Endpoint就類似于xml web service中的一個asmx文件,它包括三個組成部分1)Address 2) Binding 3) Contract,此三者被稱為組成Endpoint的"ABC",下圖闡述了Endpoint的組成結構:
ABC分別解決了Endpoint的如下問題:
A解決了Endpoint在哪的問題,也就是"Where is the endpoint?"
B 解決的是如何與Endpoint通訊的問題,也就是"How to communicate with endpoint?"
C解決了Endpoint提供什么功能的問題,也就是"What functionalities do the endpoint provide?"
上面的兩篇文章WCF從理論到實踐三:八號當鋪之黑色契約和WCF從理論到實踐四:路在何方分別闡述了Contract和Address,本文著重討論Binding, Binding實現的是在客戶端和服務端進行通訊的底層細節,包括數據如何傳輸(比如采用Tcp,Http等),如何解決安全問題(SSL,Message Level Security等),傳輸的消息的格式(如text/xml,MTOM,binary等)。
Binding的組成?
Binding包括三個組成部分:NameSpace,Name和BindingElement,如下圖所示:
Name和NameSpace是服務元數據(meta date)的唯一標志,換句話說,二者就像Binding的姓名一樣,而BindingElement則描述Binding的特征,我們說Binding能解決通訊方式的問題,關鍵是靠BindingElement來進行描述。
Binding Element 的分類
Binding Element中最核心的組成部分,它分為以下三種類型
- Encoding Binding Element:它用于描述傳輸數據的編碼方式,比如用text/xml進行編碼,用binary編碼,用MTOM進行編碼都是在這個上面定義,每個Binding Element必須包含一個Encoding Binding Element。
-
Transport Binding Element:它用于描述數據的傳輸方式,例如使用tcp進行傳輸,還是用http進行傳輸,還是用msmq,這些都是由Transport Binding Element來定
義,每一個Binding Element 必須包含一個Transport Binding Element
- Protocol Binding Element: 指定諸如安全性、可靠性、上下文流設置(context flow settins)
Binding描述了哪些層面的信息
一個Binding包含著豐富的信息,每種信息都描述了服務端和客戶端交互過程中的一方面,如下表所示,Binding描述了這些層面的信息:
層次 |
備注說明 |
Transactions(事務) |
TransactionFlowBindingElement,用于指定事務流程 |
Reliability(信賴) |
ReliableSessionBindingElement,用于指定對會話方式 |
Security(安全) |
SecurityBindingElement,指定安全方式 |
Encoding(編碼) |
Text, Binary, MTOM, Custom,指定數據傳輸格式 |
Transport(傳輸) |
TCP, Named Pipes, HTTP, HTTPS, MSMQ, Custom,指定傳輸方式 |
選擇正確的Binding
Binding是可以自定義實現的,可WCF框架已經為我們實現了足夠多的Binding,供我們來選擇,如下表所示:
Binding名稱 |
Configuration Element |
描述 |
BasicHttpBinding |
basicHttpBinding |
一個指定用符合基本網絡服務規范通訊的binding,它用http進行傳輸,數據格式為text/xml |
WSHttpBinding |
wsHttpBinding |
一個安全的通用的binding,但它不能在deplex中使用 |
WSDualHttpBinding |
wsDualHttpBinding |
一個安全的通用的binding,但能在deplex中使用 |
WSFederationHttpBinding |
wsFederationHttpBinding |
一個安全的通用的支持WSF的binding,能對用戶進行驗證和授權 |
NetTcpBinding |
netTcpBinding |
在wcf應用程序中最適合跨機器進行安全通訊的binding |
NetNamedPipeBinding |
netNamedPipeBinding |
在wcf應用程序中最適合本機進行安全通訊的binding |
NetMsmqBinding |
netMsmqBinding |
在wcf應用程序中最適合跨機器進行安全通訊的binding,并且支持排隊 |
NetPeerTcpBinding |
netPeerTcpBinding |
一個支持安全的,多機交互的binding |
MsmqIntegrationBinding |
msmqIntegrationBinding |
一個用于wcf與現有msmq程序進行安全通訊的binding |
下面的表格分別刪除了上表中的Binding在互操作性(Interoperability), 安全性(Security), 是否支持會話(Session), 是否支持事務(Transactions)和是否為全雙工(Duplex)上不同。
Bingding |
Interoperability |
Security |
Session |
Transactions |
Duplex |
BasicHttpBinding |
Basic Profile 1.1 |
(None), Transport, Message |
None, (None) |
None |
n/a |
WSHttpBinding |
WS |
Transport, (Message), Mixed |
(None), Transport, Reliable Session |
(None), Yes |
n/a |
WSDualHttpBinding |
WS |
(Message) |
(Reliable Session) |
(None), Yes |
Yes |
WSFederationHttpBinding |
WS-Federation |
(Message) |
(None), Reliable Session |
(None), Yes |
No |
NetTcpBinding |
.NET |
(Transport), Message |
Reliable Session, (Transport) |
(None), Yes |
Yes |
NetNamedPipeBinding |
.NET |
(Transport) |
None, (Transport) |
(None), Yes |
Yes |
NetMsmqBinding |
.NET |
Message, (Transport), Both |
(None) |
(None), Yes |
No |
NetPeerTcpBinding |
Peer |
(Transport) |
(None) |
(None) |
Yes |
MsmqIntegrationBinding |
MSMQ |
(Transport) |
(None) |
(None), Yes |
n/a |
例外,《Programming WCF Services》有一幅圖也能說明各自的特征:
下面的圖給出了我們選擇Binding的方式
本文參考資料: