Поделиться через


Создание элемента привязки BindingElement

Привязки и элементы привязки (объекты, расширяющие System.ServiceModel.Channels.Binding и System.ServiceModel.Channels.BindingElementсоответственно) — это место, где модель приложения Windows Communication Foundation (WCF) связана с фабриками каналов и прослушивателями каналов. Без привязок для использования пользовательских каналов требуется программирование на уровне канала, как описано в программировании на уровне канала службы и программировании на уровне клиента. В этом разделе описывается минимальное требование, позволяющее использовать канал в WCF, разработку BindingElement канала и включение использования из приложения, как описано на шаге 4 в разделе "Разработка каналов".

Обзор

BindingElement Создание канала позволяет разработчикам использовать его в приложении WCF. BindingElement Объекты можно использовать из System.ServiceModel.ServiceHost класса для подключения приложения WCF к каналу, не имея точных сведений о типе канала.

BindingElement После создания можно включить дополнительные функциональные возможности в зависимости от ваших требований, выполнив остальные действия по разработке каналов, описанные в разделе "Разработка каналов".

Добавление элемента привязки

Чтобы реализовать настраиваемый элемент BindingElement, напишите класс, наследуемый от BindingElement. Например, если разработан канал ChunkingChannel, который может разделять большие сообщения на блоки и восстанавливать сообщения на другой стороне, этот канал можно использовать в любой привязке, реализуя элемент BindingElement и настраивая привязку для использования этого элемента. Далее в этом разделе канал ChunkingChannel используется в качестве примера для демонстрации требований к реализации элемента привязки.

Элемент ChunkingBindingElement отвечает за создание фабрики ChunkingChannelFactory и прослушивателя ChunkingChannelListener. Он переопределяет реализации CanBuildChannelFactory и CanBuildChannelListener и проверяет, что параметром типа является IDuplexSessionChannel (в данном примере это единственная форма канала, поддерживаемая каналом ChunkingChannel) и что другие элементы привязки поддерживают эту форму канала.

BuildChannelFactory сначала проверяет возможность создания затребованной формы канала, затем получает список действий, которые должны быть выполнены для разделения сообщения на блоки, после чего создает новую фабрику ChunkingChannelFactory, передавая ее фабрике внутреннего канала. (В случае создания элемента привязки транспорта этот элемент является последним элементом в стеке привязок и, следовательно, должен создать прослушиватель канала или фабрику канала).

BuildChannelListener имеет аналогичную реализацию для создания прослушивателя ChunkingChannelListener и передаче его прослушивателю внутреннего канала.

В качестве другого примера, использующий канал транспорта, пример транспорта: UDP предоставляет следующее переопределение.

В этом примере в качестве элемента привязки выступает элемент UdpTransportBindingElement, являющийся производным элемента TransportBindingElement. Он переопределяет следующие методы для создания фабрик, связанных с каналом.

public IChannelFactory<TChannel> BuildChannelFactory<TChannel>(BindingContext context)  
{  
    return (IChannelFactory<TChannel>)(object)new UdpChannelFactory(this, context);  
}  
  
public IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)  
{  
    return (IChannelListener<TChannel>)(object)new UdpChannelListener(this, context);  
}  

Он также содержит члены для клонирования элемента BindingElement и возврата схемы (soap.udp).

Элементы привязки протоколов

Новые элементы привязки могут заменять или дополнять любые из включенных элементов привязки, добавляя новые типы транспорта, кодирования или протоколы верхних уровней. Чтобы создать новый элемент привязки протокола, начните с расширения класса BindingElement. Как минимум, необходимо реализовать BindingElement.Clone и реализовать ChannelProtectionRequirements использование IChannel.GetProperty. В результате будут возвращены требования ChannelProtectionRequirements для этого элемента привязки. Дополнительные сведения см. в разделе ChannelProtectionRequirements.

Метод Clone должен вернуть новую копию данного элемента привязки. Авторам элемента привязки рекомендуется реализовать метод Clone, используя конструктор копии, который вызывает базовый конструктор копии и затем клонирует любые дополнительные поля в этом классе.

Элементы привязки транспорта

Чтобы создать новый элемент привязки транспорта, расширьте интерфейс TransportBindingElement. Затем, как минимум, необходимо реализовать метод Clone и свойство TransportBindingElement.Scheme.

Clone. Этот метод должен вернуть новую копию данного элемента привязки. Авторам элемента привязки рекомендуется реализовать метод Clone с помощью конструктора копии, который вызывает базовый конструктор копии и затем клонирует любые дополнительные поля в этом классе.

Scheme. Свойство получения схемы Scheme возвращает схему универсального кода ресурса (URI) для транспортного протокола, представленного элементом привязки. Например, System.ServiceModel.Channels.HttpTransportBindingElement возвращаемое System.ServiceModel.Channels.TcpTransportBindingElement значение "http" и "net.tcp" из соответствующих Scheme свойств.

Элементы привязки кодирования

Чтобы создать новые элементы привязки кодирования, начните с расширения класса BindingElement и реализации класса System.ServiceModel.Channels.MessageEncodingBindingElement. Затем, как минимум, необходимо реализовать методы Clone, MessageEncodingBindingElement.CreateMessageEncoderFactory и свойство MessageEncodingBindingElement.MessageVersion.

  • Clone. Возвращает новую копию этого элемента привязки. Авторам элемента привязки рекомендуется реализовать метод Clone, используя конструктор копии, который вызывает базовый конструктор копии и затем клонирует любые дополнительные поля в этом классе.

  • CreateMessageEncoderFactory. Возвращает фабрику MessageEncoderFactory, предоставляющую дескриптор фактическому классу, который реализует новый кодировщик и должен расширить кодировщик MessageEncoder. Дополнительные сведения см. в разделах MessageEncoderFactory и MessageEncoder.

  • MessageVersion. Возвращает версию MessageVersion, применяемую в данной кодировке, которая представляет используемые версии протокола SOAP и WS-Addressing.

Полный список необязательных методов и свойств для определяемых пользователем элементов привязки кодирования см. в разделе MessageEncodingBindingElement.

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

После создания элемента привязки для канала вернитесь в раздел "Разработка каналов ", чтобы узнать, нужно ли добавить поддержку файла конфигурации в элемент привязки, если и как добавить поддержку публикации метаданных и как создать определяемую пользователем привязку, использующую элемент привязки.

См. также