Практическое руководство. Изменение привязки, предоставляемой системой
Windows Communication Foundation (WCF) включает несколько системных привязок, которые позволяют настроить некоторые свойства базовых элементов привязки, но не все свойства. В данном разделе показано, как задать свойства в элементах привязки, чтобы создать пользовательскую привязку.
Дополнительные сведения о том, как напрямую создавать и настраивать элементы привязки без использования системных привязок, см. в разделе "Пользовательские привязки".
Дополнительные сведения о создании и расширении пользовательских привязок см. в разделе "Расширение привязок".
В WCF все привязки состоят из элементов привязки. Каждый элемент привязки наследуется от класса BindingElement. Привязки, предоставляемые системой, такие как BasicHttpBinding, создают и настраивают собственные элементы привязки. В данном разделе показано, как получить доступ и изменить свойства этих элементов привязки, которые не предоставляются непосредственно в привязке, в частности, класс BasicHttpBinding.
Отдельные элементы привязки содержатся в коллекции, представленной классом BindingElementCollection, и добавляются в следующем порядке: Transaction Flow, Reliable Session, Security, Composite Duplex, One-way, Stream Security, Message Encoding и Transport. Обратите внимание, что все перечисленные элементы привязки являются обязательными для каждой привязки. Пользовательские элементы привязки также могут отображаться в коллекции элементов привязки и должны отображаться в указанном выше порядке. Например, пользовательский транспорт должен быть последним элементом в коллекции элементов привязки.
Класс BasicHttpBinding содержит три элемента привязки.
Необязательный элемент привязки безопасности: класс AsymmetricSecurityBindingElement, используемый с транспортом HTTP (безопасность на уровне сообщений), или класс 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