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


Клиент: фабрики каналов и каналы

В этом разделе рассматривается создание фабрик каналов и каналов.

Фабрики каналов и каналы

Фабрики каналов отвечают за создание каналов. Каналы, создаваемые фабриками каналов, используются для отправки сообщений. Эти каналы отвечают за получение сообщения от вышестоящего уровня, выполнение той или иной обработки и отправку сообщения нижестоящему уровню. Следующий рисунок иллюстрирует этот процесс.

Каналы и производства клиента

При закрытии фабрики каналов отвечают за закрытие всех созданных ими каналов, которые еще не закрыты. Обратите внимание, что модель в данном случае асимметрична: когда закрывается прослушиватель каналов, он прекращает только принимать новые каналы, однако оставляет существующие каналы открытыми, чтобы они могли продолжить получать сообщения.

В WCF предусмотрены вспомогательные базовые классы для этого процесса. (Схему обсуждаемых здесь вспомогательных классов каналов см. в разделе Общие сведения о модели каналов.)

Дальнейшее обсуждение основано на примере Транспорт: 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
);

См. также

Основные понятия

Разработка каналов