綁定這塊引出了很多細節。綁定解決了消息交換中的傳輸協定,傳輸,編碼等問題。如果要公開WCF服務,就要公開終結點Endpoint,WCF服務資訊交換就是Endpoint之間的資訊交換。終結點三大元素:ABC。A解決尋址問題,C解決協定(契約)問題,這裡可以設定服務的功能集,這是我們真正用到的地方,B綁定是重中之重,解決了其中最重要的一系列問題。
(一)系統提供了全面的綁定實作
系統提供了相當全面的綁定:
·BasicHttpBinding 适用于符合WS-basic profile的web服務通信。例如基于.net的WS。傳輸協定Http,消息編碼:文本/xml。在配置檔案裡這個節點的名稱就是第一個單詞全小寫,後邊單詞首字母大寫。basicHttpBinding。其它的系統提供的綁定在配置檔案中一般也按這個規則走。
·WSHttpBinding 非雙工的。
·WSDualHttpBinding 雙工的
·NetTcpBinding 跨計算機通信
·NetNamedPipeBinding 計算機内通信
·NetMsmqBinding 消息隊列
其它的省略。這裡有幾個詳細的表(這幾個表太好):
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.chs
/wcf_con/html/2c243746-45ce-4588-995e-c17126a579a6.htm
(二)綁定基類
綁定在WCF實作上就是上邊這些綁定,對應着各自的類。它們都由Binding類派生:
public class BasicHttpBinding : Binding, IBindingRuntimePreferences
Binding類
public abstract class Binding : IDefaultCommunicationTimeouts
Binding類實作了IdefaultCommunicationTimeouts接口,這個接口用于定義通信的逾時屬性。它有4個屬性:
·CloseTimeout 擷取 close 方法(由通信對象調用)在逾時之前的時間間隔。
·OpenTimeout 擷取 open 方法(由通信對象調用)在逾時之前的時間間隔。
·ReceiveTimeout 擷取 receive 方法(由通信對象調用)在逾時之前的時間間隔。
·SendTimeout 擷取 send 方法(由通信對象調用)在逾時之前的時間間隔。
(三)綁定是分層的
一個綁定對象對應着一組有序的集合,一組綁定元素對象的集合,而這些元素按層來分别處理各自的事務。因為WCF服務是基于消息交換,而這種交換是在終結點之間進行的,是以每個元素負責終結點通信的一個方面。例如:編碼,傳輸,安全等等。
它的層:
層
選項
是否必需
事務流
TransactionFlowBindingElement
否
可靠性
ReliableSessionBindingElement
安全性
對稱、非對稱、傳輸級
形狀更改
CompositeDuplexBindingElement
傳輸更新
SSL 流、Windows 流、對等解析程式
編碼
文本、二進制、MTOM、自定義
是
傳輸
TCP、命名管道、HTTP、HTTPS、MSMQ、自定義
其中編碼層和傳輸層是必要條件。
這一層一層的綁定元素(Binding Element)就是BindingElement
(四)綁定元素
綁定元素在WCF實作上就是BindingElement
它做為其它綁定元素的基類。綁定元素用于為各種類型的信道生成信道工廠和信道監聽器以處理傳出和傳入消息的綁定元素。(有的叫通道,也有叫信道的,指得是一個意思,但了解上有一些不同。)
由它派生的綁定元素實作:
OneWayBindingElement
TransportBindingElement
StreamUpgradeBindingElement
PrivacyNoticeBindingElement
UseManagedPresentationBindingElement
SecurityBindingElement
MessageEncodingBindingElement
PeerResolverBindingElement
ContextBindingElement
從字面上可以大概能夠看出每個元素的主要義務。
(五)綁定的綁定元素
這裡看下幾種系統綁定是由哪幾個綁定元素組成的。
在綁定基類中Binding有個CreateBindingElements方法,
public abstract BindingElementCollection CreateBindingElements()
它的功能就是:建立一個集合,該集合包含屬于目前綁定的綁定元素,而由綁定基類實作的各個系統綁定都實作了這個方法。然後綁定元素(BindingElement)有個GetType方法,用于擷取綁定元素執行個體(Type),然後就可以通過類型屬性來得到詳細資訊了。
(1)現在看看BasicHttpBinding綁定包含哪些綁定元素:
public void TestBasicHttpBindingElements()
{
BasicHttpBinding _binding=new BasicHttpBinding();
BindingElementCollection _list =
_binding.CreateBindingElements();
foreach (BindingElement ele in _list)
{
Console.WriteLine(ele.GetType().FullName);
}
}
結果:
System.ServiceModel.Channels.TextMessageEncodingBindingElement
System.ServiceModel.Channels.HttpTransportBindingElement
它由2層組成。從字面上可以大概推斷出一層用于消息編碼,一層用于傳輸。綁定是分層的,最低要有兩層:傳輸層與編碼層。
·TextMessageEncodingBindingElement這個綁定元素的結構為:
BindingElement
TextMessageEncodingBindingElement
它的定義為:
public sealed class TextMessageEncodingBindingElement
: MessageEncodingBindingElement,
IWsdlExportExtension, IPolicyExportExtension
·HttpTransportBindingElement這個綁定元素的結構為:
HttpTransportBindingElement
public class HttpTransportBindingElement
: TransportBindingElement,
(2)WSDualHttpBinding綁定元素
public void TestWSDuplexHttpBindingElements()
WSDualHttpBinding _binding = new WSDualHttpBinding();
System.ServiceModel.Channels.TransactionFlowBindingElement
System.ServiceModel.Channels.ReliableSessionBindingElement
System.ServiceModel.Channels.SymmetricSecurityBindingElement
System.ServiceModel.Channels.CompositeDuplexBindingElement
System.ServiceModel.Channels.OneWayBindingElement
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園