作法:自訂系統提供的繫結
Windows Communication Foundation (WCF) 所包含數種系統提供的繫結可讓您設定一些基礎繫結項目的屬性,但不包含所有屬性。 本主題示範如何設定繫結項目上的屬性來建立自訂繫結。
如需了解如何不使用系統提供的繫結,直接建立和設定繫結項目的詳細資訊,請參閱自訂繫結。
如需建立和擴充自訂繫結的詳細資訊,請參閱擴充繫結。
在 WCF 中,所有繫結是由「繫結項目」所構成。 每個繫結項目均衍生自 BindingElement 類別。 諸如 BasicHttpBinding 的系統提供繫結,會建立並設定自有的繫結項目。 本主題說明如何存取與變更這些繫結項目的屬性,而這些屬性並未直接在繫結上公開 (特別是 BasicHttpBinding 類別)。
個別的繫結程序項目會包含在由 BindingElementCollection 類別表示的集合中,並依下列順序新增:異動流程、可靠工作階段、安全性、複合雙工、單向、資料流安全性、訊息編碼和傳輸。 請注意,並非每個繫結都需要所列的所有繫結項目。 使用者定義的繫結項目也可以出現在此繫結項目集合中,而且必須依照前述順序。 例如,使用者定義的傳輸必須是繫結項目集合中的最後一個項目。
BasicHttpBinding 類別包含三個繫結項目:
一種選擇性的安全性繫結項目,可以是搭配 HTTP 傳輸 (訊息層級安全性) 一起使用的 AsymmetricSecurityBindingElement 類別,或是當傳輸層提供安全性時所使用的 TransportSecurityBindingElement 類別 (這時會使用 HTTPS 傳輸)。
必要的訊息編碼器繫結項目,可以是 TextMessageEncodingBindingElement 或 MtomMessageEncodingBindingElement。
必要的傳輸繫結項目,可以是 HttpTransportBindingElement 或 HttpsTransportBindingElement。
在此範例中,我們會建立一個繫結執行個體,從中產生一個「自訂繫結」、檢查自訂繫結中的繫結項目,並在找到 HTTP 繫結項目時,將其 KeepAliveEnabled
屬性設為 false
。 KeepAliveEnabled
屬性不會直接在 BasicHttpBinding
上公開,因此我們必須建立自訂繫結以向下巡覽至繫結項目並設定此屬性。
若要修改系統提供的繫結
建立 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
從繫結中建立自訂繫結,並從其中一個自訂繫結的屬性中建立 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
對 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