Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
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 elementos auxiliares de clase base para este proceso. (Para consultar un diagrama de las clases auxiliares de canal descritas en este tema, vea Información general del modelo de canales).
La clase CommunicationObject implementa ICommunicationObject y exige el estado de equipo descrito en el paso 2 de Desarrollo de canales.
La clase
La clase
CreateChannel
en un método abstractoOnCreateChannel
.La clase
La siguiente descripción está basada en el ejemplo Transporte: 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
);