Практическое руководство. Изменение привязки, предоставляемой системой

Windows Communication Foundation (WCF) включает несколько системных привязок, которые позволяют настроить некоторые свойства базовых элементов привязки, но не все свойства. В данном разделе показано, как задать свойства в элементах привязки, чтобы создать пользовательскую привязку.

Дополнительные сведения о том, как напрямую создавать и настраивать элементы привязки без использования системных привязок, см. в разделе "Пользовательские привязки".

Дополнительные сведения о создании и расширении пользовательских привязок см. в разделе "Расширение привязок".

В WCF все привязки состоят из элементов привязки. Каждый элемент привязки наследуется от класса BindingElement. Привязки, предоставляемые системой, такие как BasicHttpBinding, создают и настраивают собственные элементы привязки. В данном разделе показано, как получить доступ и изменить свойства этих элементов привязки, которые не предоставляются непосредственно в привязке, в частности, класс BasicHttpBinding.

Отдельные элементы привязки содержатся в коллекции, представленной классом BindingElementCollection, и добавляются в следующем порядке: Transaction Flow, Reliable Session, Security, Composite Duplex, One-way, Stream Security, Message Encoding и Transport. Обратите внимание, что все перечисленные элементы привязки являются обязательными для каждой привязки. Пользовательские элементы привязки также могут отображаться в коллекции элементов привязки и должны отображаться в указанном выше порядке. Например, пользовательский транспорт должен быть последним элементом в коллекции элементов привязки.

Класс BasicHttpBinding содержит три элемента привязки.

  1. Необязательный элемент привязки безопасности: класс AsymmetricSecurityBindingElement, используемый с транспортом HTTP (безопасность на уровне сообщений), или класс TransportSecurityBindingElement, используемый при предоставлении безопасности на уровне транспорта, при этом используется транспорт HTTPS.

  2. Обязательный элемент привязки кодировщика сообщений: элемент TextMessageEncodingBindingElement или элемент MtomMessageEncodingBindingElement.

  3. Обязательный элемент привязки транспорта: элемент HttpTransportBindingElement или элемент HttpsTransportBindingElement.

В этом примере мы создадим экземпляр привязки, создадим пользовательскую привязку из нее, проверяем элементы привязки в пользовательской привязке и при поиске элемента привязки HTTP мы задали его KeepAliveEnabled свойство false. Свойство KeepAliveEnabled не представлено напрямую в привязке 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
    

См. также