Руководство: Настройка системной привязки

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

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

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

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

Отдельные элементы привязки содержатся в коллекции, представленной BindingElementCollection классом, и добавляются в этом порядке: поток транзакций, надежный сеанс, безопасность, составной дуплекс, односторонняя, потоковая безопасность, кодировка сообщений и транспорт. Обратите внимание, что не все перечисленные элементы привязки требуются в каждой привязке. Определяемые пользователем элементы привязки также могут отображаться в этой коллекции элементов привязки и должны отображаться в том же порядке, что и ранее описано. Например, определяемый пользователем транспорт должен быть последним элементом коллекции элементов привязки.

Класс 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 = {httpElement.KeepAliveEnabled}");
            httpElement.KeepAliveEnabled = false;
            Console.WriteLine($"\tAfter:  HttpTransportBindingElement.KeepAliveEnabled = {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
    

См. также