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.
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 clase CommunicationObject implementa ICommunicationObject y exige el la máquina de estados descrita en el paso 2 de Desarrollo de canales.
La clase ChannelManagerBase implementa CommunicationObject y proporciona una clase base unificada para System.ServiceModel.Channels.ChannelFactoryBase y System.ServiceModel.Channels.ChannelListenerBase. La clase ChannelManagerBase trabaja junto con ChannelBase, que es una clase base que implementa IChannel.
La clase ChannelFactoryBase implementa ChannelManagerBase y IChannelFactory, y consolida las sobrecargas de
CreateChannel
en un método abstractoOnCreateChannel
.La clase ChannelListenerBase implementa IChannelListener. Se encarga de la administración de estados básica.
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
);