Клиент: фабрики каналов и каналы
В этом разделе рассматривается создание фабрик каналов и каналов.
Фабрики каналов и каналы
Фабрики каналов отвечают за создание каналов. Каналы, создаваемые фабриками каналов, используются для отправки сообщений. Эти каналы отвечают за получение сообщения от вышестоящего уровня, выполнение той или иной обработки и отправку сообщения нижестоящему уровню. Следующий рисунок иллюстрирует этот процесс.
Фабрика каналов создает каналы.
При закрытии фабрики каналов отвечают за закрытие всех созданных ими каналов, которые еще не закрыты. Обратите внимание, что модель в данном случае асимметрична: когда закрывается прослушиватель каналов, он прекращает только принимать новые каналы, однако оставляет существующие каналы открытыми, чтобы они могли продолжить получать сообщения.
WCF предоставляет вспомогательные средства базового класса для этого процесса. (Схема вспомогательных классов канала, рассмотренных в этом разделе, см . в разделеОбзор модели канала.)
Класс CommunicationObject реализует ICommunicationObject и применяет компьютер состояния, описанный на шаге 2 разработки каналов.
Класс ChannelManagerBase реализует CommunicationObject и предоставляет единый базовый класс для System.ServiceModel.Channels.ChannelFactoryBase и System.ServiceModel.Channels.ChannelListenerBase. Класс ChannelManagerBase работает совместно с классом ChannelBase - базовым классом, реализующим интерфейс IChannel.
Класс ChannelFactoryBase реализует ChannelManagerBase и IChannelFactory объединяет
CreateChannel
перегрузки в одинOnCreateChannel
абстрактный метод.Класс ChannelListenerBase реализует IChannelListener. Он отвечает за базовое управление состоянием.
Следующее обсуждение основано на примере транспорта: UDP .
Создание фабрики каналов
ФабрикаUdpChannelFactory
наследуется от класса ChannelFactoryBase. В образце переопределяется метод GetProperty для обеспечения доступа к версии сообщения кодировщика сообщений. Также переопределяется метод OnClose для уничтожения созданного экземпляра класса BufferManager при переходе конечного автомата в другое состояние.
Выходной канал UDP
КлассUdpOutputChannel
реализует интерфейс IOutputChannel. Конструктор проверяет аргументы и создает целевой объект EndPoint на основании переданного ему адреса EndpointAddress.
Переопределение метода OnOpen создает сокет, используемый для отправки сообщений этому объекту EndPoint.
this.socket = new Socket(
this.remoteEndPoint.AddressFamily,
SocketType.Dgram,
ProtocolType.Udp
);
Канал может быть закрыт правильно или неправильно. При верном закрытии канала сокет закрывается и вызывается метод OnClose
базового класса. Если при этом создается исключение, инфраструктура вызывает метод Abort
, чтоб обеспечить очистку канала.
this.socket.Close();
base.OnClose(timeout);
Реализация Send()
и BeginSend()
/EndSend()
. Реализация делится на две принципиальные части. Сначала сериализуйте сообщение в байтовый массив:
ArraySegment<byte> messageBuffer = EncodeMessage(message);
Затем отправьте получившиеся данные по сети:
this.socket.SendTo(
messageBuffer.Array,
messageBuffer.Offset,
messageBuffer.Count,
SocketFlags.None,
this.remoteEndPoint
);