有數種方式可以建立系統未提供的系結:
根據 CustomBinding 類別建立自定義系結,這是您填入綁定項的容器。 然後,自定義系結會新增至服務端點。 您可以透過程式設計方式或在應用程式組態檔中建立自定義系結。 若要從應用程式群組態檔使用綁定項,綁定項必須擴充 BindingElementExtensionElement。 如需自訂系結的詳細資訊,請參閱 自定義系結 和 CustomBinding。
您可以建立衍生自標準系結的類別。 例如,您可以從衍生類別 WSHttpBinding 並覆寫 CreateBindingElements 方法來取得綁定項,並插入自定義綁定項,或為安全性建立特定值。
您可以建立新的 Binding 類型,以完全控制整個系結實作。
綁定項的順序
每個綁定項都代表傳送或接收訊息時的處理步驟。 執行時,綁定元素會建立建立輸出與輸入通道堆疊所需的通道與監聽者。
綁定項有三種主要類型:通訊協議綁定項、編碼綁定項和傳輸綁定項。
通訊協議綁定項 – 這些元素代表處理訊息的較高層級處理步驟。 這些綁定項所建立的通道和接聽程式可以新增、移除或修改訊息內容。 指定的系結可能會有任意數目的通訊協定繫結項,每個系結都繼承自 BindingElement。 Windows Communication Foundation (WCF) 包含數個通訊協議綁定項,包括 ReliableSessionBindingElement 和 SymmetricSecurityBindingElement。
編碼綁定項 – 這些元素代表訊息之間的轉換,以及準備好在網路傳輸的編碼。 一般 WCF 系結只包含一個編碼綁定項。 編碼繫結項的範例包括 MtomMessageEncodingBindingElement、 BinaryMessageEncodingBindingElement和 TextMessageEncodingBindingElement。 如果未為系結指定編碼綁定項,則會使用預設編碼。 當傳輸為 HTTP 時,預設值為文字;否則為二進位。
傳輸綁定項 – 這些元素代表傳輸通訊協定上的編碼訊息傳輸。 一般 WCF 系結只包含一個傳輸綁定項,其繼承自 TransportBindingElement。 傳輸繫結項目的範例包括 TcpTransportBindingElement、 HttpTransportBindingElement與 NamedPipeTransportBindingElement。
建立新的系結時,新增綁定項的順序很重要。 一律以下列順序新增綁定項:
| 層 | 選項 | 為必填項目 |
|---|---|---|
| 交易流程 | System.ServiceModel.Channels.TransactionFlowBindingElement | 否 |
| 可靠性 | System.ServiceModel.Channels.ReliableSessionBindingElement | 否 |
| 安全性 | System.ServiceModel.Channels.SecurityBindingElement | 否 |
| 複合雙工 | System.ServiceModel.Channels.CompositeDuplexBindingElement | 否 |
| 編碼 | Text、Binary、MTOM、Custom | 是* |
| 運輸 | TCP、命名管道、HTTP、HTTPS、MSMQ、自定義 | 是的 |
*因為每個系結都需要編碼,如果未指定編碼,WCF 會為您新增預設編碼。 默認值為 HTTP 和 HTTPS 傳輸的 Text/XML,否則為 Binary。
建立新的綁定項
除了 WCF 所提供的衍生 BindingElement 型別之外,您還可以建立自己的綁定項。 這讓您可以自定義系結的創建方式,並通過創建自己的 BindingElement 元件來組合堆疊中的其他系統提供的類型。
例如,如果您實作 LoggingBindingElement 以提供將訊息記錄至資料庫的能力,則必須將它放在通道堆疊中的一個傳輸通道之上。 在此情況下,應用程式會建立自定義系結,將LoggingBindingElement與TcpTransportBindingElement組合,如下列範例所示。
Binding customBinding = new CustomBinding(
new LoggingBindingElement(),
new TcpTransportBindingElement()
);
撰寫新綁定項的方式取決於其確切功能。 其中一個範例 :Transport: UDP 提供如何實作一種綁定項的詳細描述。
建立新的系結
使用者建立的綁定項可以透過兩種方式使用。 上一節說明第一種方式:透過自定義系結。 自訂綁定允許用戶根據一組任意綁定元素,包括使用者建立的綁定元素,來建立自己的綁定。
如果您在多個應用程式中使用系結,請建立自己的系結並擴充 Binding。 這可避免每次您想要使用自定義系結時手動建立自定義系結。 使用者定義的系結可讓您定義系結的行為,並包含使用者定義的綁定項。 而且它 已預先封裝:您不需要在每次使用它時重建系結。
使用者定義的系結至少必須實作 CreateBindingElements 方法和 Scheme 屬性。
方法會 CreateBindingElements 傳回新的 BindingElementCollection ,其中包含系結的綁定項。 集合會排序,而且應該先包含通訊協議綁定項,後面接著編碼綁定項,後面接著傳輸綁定項。 使用 WCF 系統提供的綁定項時,您必須遵循 自定義系結中指定的綁定項排序規則。 這個集合絕對不應該參考使用者定義繫結類別內所參考的物件,因此,每次呼叫 Clone() 時,繫結作者必須傳回 BindingElementCollection 的 CreateBindingElements。
屬性 Scheme 代表系結上使用之傳輸通訊協定的 URI 配置。 例如, WSHttpBinding 和 NetTcpBinding 會從各自的 Scheme 屬性傳回 “HTTP” 和 “net.tcp”。
如需使用者定義系結之選擇性方法和屬性的完整清單,請參閱 Binding。
範例
這個範例會在 SampleProfileUdpBinding 中實作設定檔繫結,並從 Binding 衍生。
SampleProfileUdpBinding內包含最多四個綁定項:一個使用者建立UdpTransportBindingElement;以及三個系統提供:TextMessageEncodingBindingElement、 CompositeDuplexBindingElement和 ReliableSessionBindingElement。
public override BindingElementCollection CreateBindingElements()
{
BindingElementCollection bindingElements = new BindingElementCollection();
if (ReliableSessionEnabled)
{
bindingElements.Add(session);
bindingElements.Add(compositeDuplex);
}
bindingElements.Add(encoding);
bindingElements.Add(transport);
return bindingElements.Clone();
}
雙工合約的安全性限制
並非所有綁定項彼此相容。 特別是,在雙工合約使用時,安全綁定元素有一些限制。
One-Shot 安全性
您可以透過設定訊息組態元素的negotiateServiceCredential屬性為<,來實作「單次」安全性,其中所有必要的安全性憑證都將以單一訊息>傳送false。
單次驗證不適用於雙向通信合約。
針對 Request-Reply 合約,只有在安全性綁定項下方的系結堆棧支援建立 IRequestChannel 或 IRequestSessionChannel 實例時,單次驗證才能運作。
如果是單向合約,如果安全性綁定項下方的系結堆疊支援建立 IRequestChannel、 IRequestSessionChannelIOutputChannel 或 IOutputSessionChannel 實例,單次驗證就會運作。
Cookie 模式安全性內容令牌
Cookie 模式下的安全性上下文令牌無法與雙工合約搭配使用。
對於 Request-Reply 合約,Cookie 模式安全性內容令牌只有在安全性綁定項下方的系結堆疊支援建立 IRequestChannel 或 IRequestSessionChannel 實例時才能運作。
如果是單向合約,如果安全性綁定項下方的系結堆疊支援建立 IRequestChannel 或 IRequestSessionChannel 實例,Cookie 模式安全性內容令牌就會運作。
會話模式安全性內容令牌
如果在安全性綁定元素下方的系結堆疊支援建立 IDuplexChannel 或 IDuplexSessionChannel 實例,那麼會話模式 SCT 可以適用於雙工合約。
如果安全性綁定項下方的繫結堆疊支援建立 IDuplexChannel、IDuplexSessionChannel、IRequestChannel 或 IRequestSessionChannel 實例,SCT 會話模式適用於 Request-Reply 合約。
如果安全性綁定項下方的系結堆疊支援建立 IDuplexChannel、 IDuplexSessionChannelIRequestChannel 或 IRequestSessionChannel 實例,會話模式 SCT 適用於 1 向合約。
衍生自標準系結
您可以擴充其中一個現有的系統提供的系結,而不是建立全新的系結類別。 與上述案例非常類似,您必須覆寫 CreateBindingElements 方法和 Scheme 屬性。