Клиент: фабрики каналов и каналы
В этом разделе рассматривается создание фабрик каналов и каналов.
Фабрики каналов и каналы
Фабрики каналов отвечают за создание каналов. Каналы, создаваемые фабриками каналов, используются для отправки сообщений. Эти каналы отвечают за получение сообщения от вышестоящего уровня, выполнение той или иной обработки и отправку сообщения нижестоящему уровню. Следующий рисунок иллюстрирует этот процесс.
При закрытии фабрики каналов отвечают за закрытие всех созданных ими каналов, которые еще не закрыты. Обратите внимание, что модель в данном случае асимметрична: когда закрывается прослушиватель каналов, он прекращает только принимать новые каналы, однако оставляет существующие каналы открытыми, чтобы они могли продолжить получать сообщения.
В WCF предусмотрены вспомогательные базовые классы для этого процесса. (Схему обсуждаемых здесь вспомогательных классов каналов см. в разделе Общие сведения о модели каналов.)
Класс CommunicationObject реализует интерфейс ICommunicationObject и принудительно создает конечный автомат, описанный в пункте 2 раздела Разработка каналов.
Класс
Класс
CreateChannel
в один абстрактный методOnCreateChannel
.Класс
Дальнейшее обсуждение основано на примере Транспорт: 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
);