建立使用者定義繫結

您有幾種方式可以建立系統不提供的繫結:

  • 依據 CustomBinding 類別來建立自訂繫結,此類別是一個容器,可供您填入繫結項目。 接著自訂繫結會新增至服務端點。 您可以程式設計方式,或是透過應用程式組態檔來建立自訂繫結。 若要使用應用程式組態檔的繫結項目,繫結項目必須延伸 BindingElementExtensionElement。 如需建立繫結的詳細資訊,請參閱自訂繫結CustomBinding

  • 您可以建立衍生自標準繫結的類別。 例如,您可以從 WSHttpBinding 衍生類別,並覆寫 CreateBindingElements 方法來取得繫結項目,並插入自訂繫結項目或是建立特定的安全值。

  • 您可以建立新的 Binding 型別以完全掌控整個繫結實作。

繫結項目的順序

每個繫結項目都代表傳送或接收訊息時的一個處理步驟。 在執行階段,繫結項目會建立通道和接聽項,它們是建立傳出和傳入通道堆疊的必要項目。

繫結項目主要分為三種:通訊協定繫結項目、編碼繫結項目,和傳輸繫結項目。

通訊協定繫結項目 – 這些項目代表會處理訊息的較高階處理步驟。 由這些繫結項目所建立的通道與接聽項,可以新增、移除,或是修改訊息內容。 特定繫結可能包含任意數量的通訊協定繫結項目,而這些項目每個都繼承自 BindingElement。 Windows Communication Foundation (WCF) 包含數個通訊協定繫結項目,其中包括 ReliableSessionBindingElementSymmetricSecurityBindingElement

編碼繫結程序項目 – 這些項目代表訊息與準備好在網路上進行傳輸的編碼之間的轉換。 一般的 WCF 繫結剛好包含一個編碼繫結項目。 編碼繫結項目範例包含 MtomMessageEncodingBindingElementBinaryMessageEncodingBindingElement,和 TextMessageEncodingBindingElement。 如果某個繫結未指定編碼繫結項目,則會使用預設編碼。 當傳輸為 HTTP 和二進位格式,預設為文字。

傳輸繫結項目 – 這些項目代表傳輸通訊協定上編碼訊息的傳輸。 一般的 WCF 繫結剛好包含一個傳輸繫結項目 (繼承自TransportBindingElement)。 傳輸繫結項目範例包含 TcpTransportBindingElementHttpTransportBindingElementNamedPipeTransportBindingElement

建立新繫結時,新增的繫結項目順序非常重要。 請務必遵守下列順序加入繫結項目:

選項。 必要
異動流程 System.ServiceModel.Channels.TransactionFlowBindingElement No
可靠性 System.ServiceModel.Channels.ReliableSessionBindingElement No
安全性 System.ServiceModel.Channels.SecurityBindingElement No
複合雙工 System.ServiceModel.Channels.CompositeDuplexBindingElement No
編碼方式 文字、二進位、MTOM、自訂 是*
傳輸 TCP、具名管道、HTTP、HTTPS、MSMQ、自訂 Yes

因為每一個繫結都需要編碼方式,所以未指定編碼方式時,WCF 就會為您新增預設編碼方式。 預設為 Text/XML (適用於 HTTP 和 HTTPS 傳輸) 和 Binary (適用於其他傳輸)。

建立新的繫結項目

除了衍生自BindingElement(由 WCF 提供) 的型別之外,您還可以建立自己的繫結項目。 這樣一來,您就可以自訂繫結程序堆疊的建立方式和內含的元件,並使用堆疊中其他系統提供型別共同組成自己的 BindingElement

例如,如果您實作了可將訊息記錄至資料庫的 LoggingBindingElement,則您必須將其放置到通道堆疊中的傳輸通道上層。 在此情況中,應用程式會建立由 LoggingBindingElementTcpTransportBindingElement 組成的自訂繫結,如下列範例所示。

Binding customBinding = new CustomBinding(  
  new LoggingBindingElement(),
  new TcpTransportBindingElement()  
);  

撰寫新的繫結項目的方式,需視其明確的功能而定。 其中一個範例傳輸:UDP 如何實作某種繫結項目提供詳細的解說。

建立新繫結

您可以透過下列兩種方式運用使用者建立的繫結項目。 上一節說明了第一種方式,亦即透過自訂繫結。 自訂繫結允許使用者根據任意一組繫結項目來建立自己的繫結,包括使用者建立的繫結。

如果您在一個以上的應用程式中使用繫結,請建立自己的繫結並延伸 Binding。 這樣一來,每次當您想要使用繫結時,都不用重新手動建立自訂繫結。 使用者定義的繫結可讓您定義繫結行為,並包含使用者定義的繫結項目。 而且它是「預先封裝」:您不需要在每次使用時重新建置繫結。

使用者定義的繫結必須至少實作 CreateBindingElements 方法和 Scheme 屬性。

CreateBindingElements 方法會傳回新的 BindingElementCollection,其中包含繫結的繫結項目。 經過排序的集合應該會先包含通訊協定繫結項目,而後包含編碼繫結項目,最後才是包含傳輸繫結項目。 使用 WCF 系統提供的繫結項目時,必須遵循自訂繫結中指定的繫結項目順序規則。 此集合一律不得參考使用者定義的繫結類別所參考的物件;如此一來,繫結作者必須在每次呼叫 Clone() 時,傳回 BindingElementCollectionCreateBindingElements

Scheme 屬性代表繫結上正在使用的傳輸通訊協定的 URI 配置。 例如,WSHttpBindingNetTcpBinding 會從其個別的 Scheme 屬性中傳回 "http" 和 "net.tcp"。

如需使用者定義繫結之選擇性方法與屬性的完整清單,請參閱 Binding

範例

此範例會在衍生自 SampleProfileUdpBindingBinding 中實作設定檔繫結。 SampleProfileUdpBinding 最多可在其中包含四個繫結項目:一個使用者建立的 UdpTransportBindingElement;三個系統提供的 TextMessageEncodingBindingElementCompositeDuplexBindingElementReliableSessionBindingElement

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();  
}  

雙工合約的安全性限制

並非所有繫結程序項目都能彼此相容。 具體來說,安全性繫結項目一旦與雙工合約併用,會有一些限制。

單次安全性

您可以實作「單次」安全性,並透過單一訊息來傳送所有必要的安全性認證,方法是藉由將 <message> 設定元素的negotiateServiceCredential屬性設為false

單次驗證無法與雙工合約一起使用。

對於要求-回覆合約來說,只有當安全性繫結項目底下的繫結堆疊支援建立 IRequestChannelIRequestSessionChannel 執行個體時,才能使用單次驗證。

對於單向合約來說,如果安全性繫結項目底下的繫結堆疊支援建立 IRequestChannelIRequestSessionChannelIOutputChannelIOutputSessionChannel 執行個體時,就能使用單次驗證。

Cookie 模式的安全性內容權杖無法搭配雙工合約一起使用。

對於要求-回覆合約來說,只有當安全性繫結項目底下的繫結堆疊支援建立 IRequestChannelIRequestSessionChannel 執行個體時,才能使用 Cookie 模型的安全性內容權杖。

對於單向合約來說,如果安全性繫結項目底下的繫結堆疊支援建立 IRequestChannelIRequestSessionChannel 執行個體時,就能使用 Cookie 模型的安全性內容權杖。

工作階段模式的安全性內容權杖

如果安全性繫結項目底下的繫結堆疊支援建立 IDuplexChannelIDuplexSessionChannel 執行個體,就能在雙工合約上使用工作階段模式 SCT。

如果安全性繫結項目底下的繫結堆疊支援建立 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 執行個體,就能在要求-回覆合約上使用工作階段模式 SCT。

如果安全性繫結項目底下的繫結堆疊支援建立 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 執行個體,就能在單向合約上使用工作階段模式 SCT。

衍生自標準繫結

您可以不建立全新的繫結類別,而改為擴充其中一個現有的系統提供繫結。 與先前的情況非常類似,這次您必須覆寫 CreateBindingElements 屬性的 Scheme 方法。

另請參閱