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


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

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

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

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

Client Factories and Channels
Фабрика каналов создает каналы.

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

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  
);  

См. также