共用方式為


作法:自訂系統提供的繫結

Windows Communication Foundation (WCF) 所包含數種系統提供的繫結可讓您設定一些基礎繫結項目的屬性,但不包含所有屬性。 本主題示範如何設定繫結項目上的屬性來建立自訂繫結。

如需了解如何不使用系統提供的繫結,直接建立和設定繫結項目的詳細資訊,請參閱自訂繫結

如需建立和擴充自訂繫結的詳細資訊,請參閱擴充繫結

在 WCF 中,所有繫結是由「繫結項目」所構成。 每個繫結項目均衍生自 BindingElement 類別。 諸如 BasicHttpBinding 的系統提供繫結,會建立並設定自有的繫結項目。 本主題說明如何存取與變更這些繫結項目的屬性,而這些屬性並未直接在繫結上公開 (特別是 BasicHttpBinding 類別)。

個別的繫結程序項目會包含在由 BindingElementCollection 類別表示的集合中,並依下列順序新增:異動流程、可靠工作階段、安全性、複合雙工、單向、資料流安全性、訊息編碼和傳輸。 請注意,並非每個繫結都需要所列的所有繫結項目。 使用者定義的繫結項目也可以出現在此繫結項目集合中,而且必須依照前述順序。 例如,使用者定義的傳輸必須是繫結項目集合中的最後一個項目。

BasicHttpBinding 類別包含三個繫結項目:

  1. 一種選擇性的安全性繫結項目,可以是搭配 HTTP 傳輸 (訊息層級安全性) 一起使用的 AsymmetricSecurityBindingElement 類別,或是當傳輸層提供安全性時所使用的 TransportSecurityBindingElement 類別 (這時會使用 HTTPS 傳輸)。

  2. 必要的訊息編碼器繫結項目,可以是 TextMessageEncodingBindingElementMtomMessageEncodingBindingElement

  3. 必要的傳輸繫結項目,可以是 HttpTransportBindingElementHttpsTransportBindingElement

在此範例中,我們會建立一個繫結執行個體,從中產生一個「自訂繫結」、檢查自訂繫結中的繫結項目,並在找到 HTTP 繫結項目時,將其 KeepAliveEnabled 屬性設為 falseKeepAliveEnabled 屬性不會直接在 BasicHttpBinding 上公開,因此我們必須建立自訂繫結以向下巡覽至繫結項目並設定此屬性。

若要修改系統提供的繫結

  1. 建立 BasicHttpBinding 類別的執行個體,並將其安全性模式設為訊息層級。

    //  Create an instance of the T:System.ServiceModel.BasicHttpBinding
    //  class and set its security mode to message-level security.
    BasicHttpBinding binding = new BasicHttpBinding();
    binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
    binding.Security.Mode = BasicHttpSecurityMode.Message;
    
    '  Create an instance of the T:System.ServiceModel.BasicHttpBinding 
    '  class and set its security mode to message-level security.
    Dim binding As New BasicHttpBinding()
    With binding.Security
        .Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate
        .Mode = BasicHttpSecurityMode.Message
    End With
    
  2. 從繫結中建立自訂繫結,並從其中一個自訂繫結的屬性中建立 BindingElementCollection 類別。

    //  Create a custom binding from the binding
    CustomBinding cb = new CustomBinding(binding);
    //  Get the BindingElementCollection from this custom binding
    BindingElementCollection bec = cb.Elements();
    
    '  Create a custom binding from the binding 
    Dim cb As New CustomBinding(binding)
    '  Get the BindingElementCollection from this custom binding 
    Dim bec = cb.Elements
    
  3. BindingElementCollection 類別執行迴圈,並在找到 HttpTransportBindingElement 類別時,將其 KeepAliveEnabled 屬性設為 false

    //  Loop through the collection, and when you find the HTTP binding element
    //  set its KeepAliveEnabled property to false
    foreach (BindingElement be in bec)
    {
        Type thisType = be.GetType();
        Console.WriteLine(thisType);
        if (be is HttpTransportBindingElement)
        {
            HttpTransportBindingElement httpElement = (HttpTransportBindingElement)be;
            Console.WriteLine("\tBefore: HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled);
            httpElement.KeepAliveEnabled = false;
            Console.WriteLine("\tAfter:  HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled);
        }
    }
    
    '  Loop through the collection, and when you find the HTTP binding element
    '  set its KeepAliveEnabled property to false
    For Each be In bec
        Dim thisType = be.GetType()
        Console.WriteLine(thisType)
        If TypeOf be Is HttpTransportBindingElement Then
            Dim httpElement As HttpTransportBindingElement = CType(be, HttpTransportBindingElement)
            Console.WriteLine(Constants.vbTab & "Before: HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled)
            httpElement.KeepAliveEnabled = False
            Console.WriteLine(vbTab & "After:  HttpTransportBindingElement.KeepAliveEnabled = {0}", httpElement.KeepAliveEnabled)
        End If
    Next be
    

另請參閱