Создание элемента привязки 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. Затем, как минимум, необходимо реализовать System.ServiceModel.Channels.BindingElement.Clone и ChannelProtectionRequirements, используя System.ServiceModel.Channels.IChannel.GetProperty. В результате будут возвращены требования ChannelProtectionRequirements для этого элемента привязки. Дополнительные сведения см. в разделе ChannelProtectionRequirements.
Метод Clone должен вернуть новую копию данного элемента привязки. Авторам элемента привязки рекомендуется реализовать метод Clone, используя конструктор копии, который вызывает базовый конструктор копии и затем клонирует любые дополнительные поля в этом классе.
Элементы привязки транспорта
Чтобы создать новый элемент привязки транспорта, расширьте интерфейс TransportBindingElement. Затем, как минимум, необходимо реализовать метод Clone и свойство System.ServiceModel.Channels.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, System.ServiceModel.Channels.MessageEncodingBindingElement.CreateMessageEncoderFactory и свойство System.ServiceModel.Channels.MessageEncodingBindingElement.MessageVersion.
Clone. Возвращает новую копию этого элемента привязки. Авторам элемента привязки рекомендуется реализовать метод Clone, используя конструктор копии, который вызывает базовый конструктор копии и затем клонирует любые дополнительные поля в этом классе.
CreateMessageEncoderFactory. Возвращает фабрику MessageEncoderFactory, предоставляющую дескриптор фактическому классу, который реализует новый кодировщик и должен расширить кодировщик MessageEncoder. Дополнительные сведения см. в разделах MessageEncoderFactory и MessageEncoder.
MessageVersion. Возвращает версию MessageVersion, применяемую в данной кодировке, которая представляет используемые версии протокола SOAP и WS-Addressing.
Полный список необязательных методов и свойств для определяемых пользователем элементов привязки кодирования см. в разделе MessageEncodingBindingElement.
Дополнительные сведения о создании нового элемента привязки см. в разделе Создание пользовательских привязок.
После создания элемента привязки для канала вернитесь к разделу Разработка каналов, чтобы выяснить, требуется ли добавить в созданный элемент привязки поддержку файла конфигурации, необходимо ли добавить поддержку публикации метаданных и как это сделать, и нужно ли создать определяемую пользователем привязку, использующую созданный элемент привязки, и как это сделать.