Compartir a través de


Canales

Este tema es específico de una tecnología heredada que se mantiene para la compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para nuevo desarrollo. Las aplicaciones distribuidas se deberían desarrollar utilizando  Windows Communication Foundation (WCF).

Los canales son objetos que transportan los mensajes entre las aplicaciones a través de límites remotos, por ejemplo, dominios de aplicación, procesos y equipos. Un canal puede escuchar los mensajes entrantes en un extremo, enviar los mensajes salientes a otro extremo o ambas cosas. Esto permite conectar una gran variedad de protocolos, incluso si Common Language Runtime no está en el otro extremo del canal.

Los canales deben implementar la interfaz IChannel, que proporciona propiedades informativas ChannelName y ChannelPriority. Los canales diseñados para realizar escuchas de un protocolo determinado en un puerto determinado implementan IChannelReceiver y los canales diseñados para enviar información implementan IChannelSender. Tanto el objeto TcpChannel como el HttpChannel implementan ambas interfaces, por lo que se pueden utilizar para enviar o recibir información.

Puede registrar los canales con la infraestructura remota de las siguientes formas:

  • Si está publicando un objeto utilizable de forma remota, llame a a ChannelServices.RegisterChannel antes de registrar su objeto de servidor.

  • Si está utilizando la funcionalidad de un objeto utilizable de forma remota, llame a RegisterChannel antes de crear una instancia de su objeto de servidor.

Los canales también pueden cargarse a partir del fichero de configuración de comunicación remota. Para obtener información detallada, consulte Configuración.

En el cliente, los mensajes se pasan a la cadena de receptores de canal del cliente una vez que recorren la cadena de contexto del cliente. El primer receptor de canal suele ser un receptor de formateador, que serializa el mensaje en una secuencia, y ésta se pasa por la cadena de receptores de canal en sentido descendente hasta el receptor de transporte del cliente. El receptor de transporte del cliente escribe entonces la secuencia en la conexión.

En el servidor, el receptor de transporte del servidor lee las solicitudes de la conexión y pasa la secuencia de solicitud a la cadena de receptores de canal del servidor. El receptor de formateadores del servidor situado al final de esta cadena deserializa la solicitud en un mensaje. A continuación, pasa este mensaje a la infraestructura remota. Para obtener más información sobre los receptores de canal, consulte Receptores y Cadenas de receptores.

Reglas del canal

Cuando un cliente llama a un método en un objeto remoto, los parámetros y otros detalles relacionados con la llamada se transportan a través del canal al objeto remoto. Los resultados de la llamada se devuelven de la misma forma. Un cliente puede seleccionar cualquiera de los canales registrado en el servidor para comunicarse con el objeto remoto, permitiendo, por tanto, a los programadores a la libertad seleccionar los canales que mejor se adapten a sus necesidades. También es posible personalizar cualquier canal existente o generar canales nuevos que utilicen un protocolo de comunicaciones diferente. La selección de canal está sujeta a las reglas siguientes:

  • Al menos un canal debe estar registrado con el sistema remoto en el servidor antes de que se pueda llamar a un objeto remoto. Antes de registrar los objetos se deben registrar los canales. Si un canal no se registra en el cliente, el sistema remoto elige o crea uno para enviar las llamadas salientes.

    dkfd3wha.note(es-es,VS.100).gifNota:
    Si el cliente espera una función de devolución de llamada, se debe registrar un canal de escucha en el cliente y el servidor debe configurarse para utilizar un canal compatible.

  • Los canales se registran en una base por dominio de aplicación. Un único proceso puede contener varios dominios de aplicación. Cuando un proceso finaliza, se destruyen automáticamente todos los canales registrados por él.

  • Los nombres del canal deben ser únicos dentro de un dominio de aplicación. Por ejemplo, puesto que los canales predeterminados tienen nombres, para registrar dos objetos HttpChannel en un dominio de aplicación, se deben cambiar los nombres de los canales antes de registrarlos. En el siguiente ejemplo de código C# se muestra este caso.

    IDictionary prop = new Hashtable();
    prop["name"] = "http1";
    prop["port"] = "9001";
    ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
    
  • No puede registrar un canal que realiza escuchas en un puerto concreto más de una vez. Aunque los canales se registran por cada dominio de aplicación, diferentes dominios de aplicación en el mismo equipo no pueden registrar el mismo canal de escuchas en el mismo puerto.

  • Si no está seguro sobre si un puerto está disponible, utilice 0 (cero) al configurar el puerto de su canal y el sistema remoto elegirá un puerto disponible para usted.

  • Los clientes pueden comunicarse con un objeto remoto utilizando cualquier canal registrado. El sistema remoto se asegura de que el objeto remoto esté conectado al canal derecho cuando un cliente intenta conectarse con el objeto. El cliente es responsable de llamar a ChannelServices.RegisterChannel antes de intentar comunicarse con un objeto remoto. Si espera una función de devolución de llamada, el cliente debe registrar un canal y un puerto.

Cuando un cliente llama a un método en un proxy, la llamada se intercepta, se empaqueta en un mensaje y se pasa a una instancia de la clase RealProxy. La clase RealProxy reenvía el mensaje al receptor de mensajes para su procesamiento. Un receptor de mensajes establece una conexión con el canal registrado por el objeto remoto y envía el mensaje al dominio de aplicación originando a través del canal. Allí se deserializa el mensaje y se realiza la llamada en el mismo objeto remoto.

Cuando la comunicación remota inicializa un proxy a un objeto remoto en el dominio del cliente, se recupera del canal configurado por el cliente un receptor de mensajes capaz de comunicarse con el objeto remoto llamando a IChannelSender.CreateMessageSink en el canal seleccionado.

Un aspecto confuso del sistema remoto es la relación entre los objetos remotos y los canales. Por ejemplo, cómo un objeto remoto WellKnownObjectMode.SingleCall realiza escuchas para que los clientes se conecten, si el objeto solamente se activa cuando llega una llamada.

En parte, esto es posible porque los objetos remotos comparten los canales; un objeto remoto no posee un canal. Las aplicaciones de servidor que hospedan los objetos remotos deben registrar tanto los canales que necesitan como los objetos que exponen con el sistema remoto. Cuando se registra un canal, éste comienza automáticamente a escuchar las solicitudes de cliente en el puerto especificado. En el caso de las llamadas sincrónicas, la conexión del cliente se mantiene para la duración de la llamada de mensaje. Puesto que cada conexión de cliente se administra en su propio subproceso, un canal único puede cubrir simultáneamente a varios clientes.

Vea también

Referencia

HttpChannel
TcpChannel

Conceptos

Elegir un canal
Formateadores de serialización
Receptores y cadenas de receptores

Otros recursos

Información general de servicios remotos de .NET Framework