Cliente: Generadores de canales y canales

Este tema describe la creación de generadores de canales y de canales.

Generadores de canales y canales

Los generadores de canales son responsables de la creación de canales. Los canales creados por los generadores de canales se utilizan para enviar mensajes. Estos canales son responsables de obtener el mensaje de la capa anterior, realizando cualquier procesamiento necesario, y, a continuación, de enviar el mensaje a la capa inferior. El siguiente gráfico ilustra este proceso.

Client Factories and Channels
Un generador de canales crea canales.

Cuando se cierran, los generadores de canales son responsables de cerrar cualquier canal creado por ellos que aún no se haya cerrado. Tenga en cuenta que, en el ejemplo, el modelo es asimétrico debido a que cuando se cierra un agente de escucha del canal solo detiene la aceptación de nuevos canales, pero mantiene abiertos los canales existentes de modo que pueden continuar recibiendo mensajes.

WCF proporciona los asistentes de clase base para este proceso. (Para un diagrama de las clases auxiliares de canal que se describen en este tema, consulte Introducción al modelo de canal).

La siguiente explicación se basa en el ejemplo Transport: UDP.

Creación de un generador de canales

La clase UdpChannelFactory se deriva de la clase ChannelFactoryBase. El ejemplo invalida GetProperty para proporcionar acceso a la versión del mensaje del codificador de mensajes. El ejemplo también invalida OnClose para anular nuestra instancia de BufferManager cuando se realizan las transiciones del equipo de estados.

Canal de salida UDP

La clase UdpOutputChannel implementa la interfaz IOutputChannel. El constructor valida los argumentos y construye un objeto de destino EndPoint basado en la EndpointAddress a la que se pasa.

La invalidación de OnOpen crea un socket que se utiliza para enviar los mensajes a EndPoint.

this.socket = new Socket(  
this.remoteEndPoint.AddressFamily,
  SocketType.Dgram,
  ProtocolType.Udp
);  

El canal puede cerrarse de forma correcta o incorrecta. Si el canal se cierra correctamente, el socket se cierra y se realiza una llamada al método OnClose de la clase base. Si se inicia una excepción, la infraestructura llama a Abort para garantizar que se limpia el canal.

this.socket.Close();  
base.OnClose(timeout);  

Implemente Send() y BeginSend()/EndSend(). De este modo se divide en dos secciones principales. Primero se serializa el mensaje en una matriz de bytes:

ArraySegment<byte> messageBuffer = EncodeMessage(message);  

A continuación, se envían los datos resultantes en la conexión:

this.socket.SendTo(  
  messageBuffer.Array,
  messageBuffer.Offset,
  messageBuffer.Count,
  SocketFlags.None,
  this.remoteEndPoint  
);  

Consulte también