WCF - 自定義綁定

自定義綁定

當系統提供的某個綁定不符合服務的要求時,可以使用 CustomBinding 類。全部綁定都是從綁定元素的有序集構造而來的。自定義綁定能夠從一組系統提供的綁定元素生成,也能夠包含用戶定義的自定義綁定元素。例如,可使用自定義綁定元素在服務終結點處使用新的傳輸或編碼器。有關可運行示例,請參見Custom Binding Samples。有關更多信息,請參見 <customBinding>.數據庫

自定義綁定的構造

自定義綁定是使用 CustomBinding 構造函數並經過「堆疊」在一塊兒的綁定元素的集合構造的,這些元素的特定順序以下:編程

底層是一個必需的傳輸元素。可使用本身的傳輸,或者使用 Windows Communication Foundation (WCF) 提供的如下傳輸綁定元素之一:windows

下表總結了每層的選項。安全

選項 必需

事務網絡

TransactionFlowBindingElementsession

app

可靠性tcp

ReliableSessionBindingElementide

函數

安全

SecurityBindingElement

編碼

文本、二進制、消息傳輸優化機制 (MTOM)、自定義

傳輸

TCP、HTTP、HTTPS、命名管道(也稱爲 IPC)、對等 (P2P)、消息隊列(也稱爲 MSMQ)、自定義

此外,能夠定義本身的綁定元素,並將它們插在前面定義的任何層之間。

 

 

建立用戶定義的綁定

有多種方式能夠建立系統未提供的綁定:

  • 基於 CustomBinding 類(可向其中填充綁定元素的容器)建立一個自定義綁定。而後將自定義綁定添加到服務終結點。能夠經過編程方式或者在應用程序配置文件中建立自定義綁定。若要從應用程序配置文件中使用綁定元素,該綁定元素必須擴展 BindingElementExtensionElement。有關自定義綁定的更多信息,請參見自定義綁定CustomBinding

  • 能夠建立一個從標準綁定派生的類。例如,能夠從 WSHttpBinding 派生一個類並重寫 CreateBindingElements 方法,以獲取綁定元素並插入自定義綁定元素或創建一個特定的安全值。

  • 能夠建立一個新的 Binding 類型來徹底控制整個綁定實現。

綁定元素的順序

發送或接收消息時,每一個綁定元素都表示一個處理步驟。在運行時,綁定元素會建立必要的通道和偵聽器,用以生成傳出和傳入通道堆棧。

有三種主要的綁定元素類型:協議綁定元素、編碼綁定元素和傳輸綁定元素。

協議綁定元素 – 這些元素表示對消息執行的更高級別的處理步驟。由這些綁定元素建立的通道和偵聽器能夠添加、移除或修改消息內容。給定的綁定能夠具備任意數量的協議綁定元素,每個元素都從 BindingElement 繼承。Windows Communication Foundation (WCF) 包括幾種協議綁定元素,其中包括 ReliableSessionBindingElementSymmetricSecurityBindingElement

編碼綁定元素 – 這些元素表示消息與準備用於網絡傳輸的編碼之間的轉換。典型的 WCF 綁定正好包括一個編碼綁定元素。編碼綁定元素的示例包括 MtomMessageEncodingBindingElementBinaryMessageEncodingBindingElementTextMessageEncodingBindingElement。若是未對綁定指定編碼綁定元素,則使用默認的編碼。當傳輸協議是 HTTP 時,默認編碼爲文本;對於其餘傳輸協議,默認編碼爲二進制。

傳輸綁定元素 – 這些元素表示傳輸協議上編碼消息的傳輸。典型的 WCF 綁定正好包括一個從 TransportBindingElement 繼承的傳輸綁定元素。傳輸綁定元素的示例包括 TcpTransportBindingElementHttpTransportBindingElementNamedPipeTransportBindingElement

建立新的綁定時,添加綁定元素的順序很重要。應始終按照如下順序添加綁定元素:

選項 必需

事務流

System.ServiceModel.Channels.TransactionFlowBindingElement

可靠性

System.ServiceModel.Channels.ReliableSessionBindingElement

安全

System.ServiceModel.Channels.SecurityBindingElement

複合雙工

System.ServiceModel.Channels.CompositeDuplexBindingElement

編碼

文本、二進制、MTOM、自定義

是*

傳輸

TCP、命名管道、HTTP、HTTPS、MSMQ、自定義

*因爲每一個綁定都須要一個編碼,所以,若是未指定編碼,則 WCF 會添加一個默認編碼。對於 HTTP 和 HTTPS 傳輸,默認編碼爲 Text/XML,對於其餘傳輸,默認編碼爲二進制。

建立新的綁定元素

除了從 WCF 提供的 BindingElement 派生的類型外,還能夠創本身的建綁定元素。這樣,您就能夠經過建立本身的、可與堆棧中其餘的系統提供的類型組合的 BindingElement,自定義建立綁定堆棧的方式和進入其中的組件。

例如,若是實現一個 LoggingBindingElement 以提供將消息記錄到數據庫中的能力,則必須將其放置在通道堆棧中傳輸通道的上方。在此狀況下,應用程序建立一個將 TcpTransportBindingElementLoggingBindingElement 組合在一塊兒的自定義綁定,如如下示例中所示。

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

寫入新的綁定元素的方式取決於元素的確切功能。一個示例(傳輸:UDP)提供了有關如何實現一種綁定元素的詳細說明。

建立新的綁定

能夠經過兩種方式使用用戶建立的綁定元素。上一節演示了第一種方式:經過自定義綁定。自定義綁定容許用戶基於任意一組綁定元素(包括用戶建立的綁定元素)建立本身的綁定。

若是在多個應用程序中使用綁定,則可建立本身的綁定並擴展 Binding。這樣就避免了在每次使用時都須要手動建立自定義綁定。用戶定義的綁定容許您定義綁定的行爲幷包括用戶定義的綁定元素。而後將用戶定義的綁定進行預包裝:沒必要在每次使用時從新生成綁定。

用戶定義的綁定至少必須實現 CreateBindingElements 方法和 Scheme 屬性。

CreateBindingElements 方法返回一個新的 BindingElementCollection,其中包含綁定的綁定元素。此集合已通過排序,應首先包含協議綁定元素,接下來是編碼綁定元素,再接下來是傳輸綁定元素。在使用 WCF 系統提供的綁定元素時,必須遵守自定義綁定中指定的綁定元素排序規則。此集合不得引用在用戶定義的綁定類中引用的對象;所以,綁定做者必須在每次調用 CreateBindingElements 時返回 BindingElementCollectionClone()

Scheme 屬性表示在綁定上使用的傳輸協議的 URI 方案。例如,WSHttpBinding 和 NetTcpBinding 從各自的 Scheme 屬性中返回「http」和「net.tcp」。

有關用戶定義綁定的可選方法和屬性的完整列表,請參見 Binding

示例

本示例在派生自 BindingSampleProfileUdpBinding 中實現配置文件綁定。SampleProfileUdpBinding 最多包含四個綁定元素:一個用戶建立的 UdpTransportBindingElement;三個系統提供的 TextMessageEncodingBindingElement CompositeDuplexBindingElementReliableSessionBindingElement

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 模式安全上下文標記

Cookie 模式安全上下文標記不能與雙工協定一塊兒使用。

對於請求-答覆協定,只有在安全綁定元素下的綁定堆棧支持建立 IRequestChannelIRequestSessionChannel 實例的狀況下,Cookie 模式安全上下文標記才能夠工做。

對於單向協定,若是安全綁定元素下的綁定堆棧支持建立 IRequestChannelIRequestSessionChannel 實例,則 Cookie 模式安全上下文標記能夠工做。

會話模式安全上下文標記

若是安全綁定元素下的綁定堆棧支持建立 IDuplexChannelIDuplexSessionChannel 實例,則會話模式 SCT 適用於雙工協定。

若是安全綁定元素下的綁定堆棧支持建立 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 實例,則會話模式 SCT 適用於請求-答覆協定。

若是安全綁定元素下的綁定堆棧支持建立 IDuplexChannelIDuplexSessionChannelIRequestChannelIRequestSessionChannel 實例,則會話模式 SCT 適用於單向協定。

派生自標準綁定

也許能夠擴展一個現有的系統提供的綁定,而不用建立一個全新的綁定類。與上一個示例很是相似,必須重寫 CreateBindingElements 方法和 Scheme 屬性。

相關文章
相關標籤/搜索