.Net Remoting
¿Qué es?
.Net Remoting es parte del .Net Framework y nos permite construir aplicaciones distribuidas fácilmente, ya sea que los componentes estén en el mismo equipo o repartidos alrededor del mundo. También nos permite comunicarnos con otros dominios de aplicaciones incluso dentro del mismo proceso.
¿Sus características?
.Net Remoting es una plataforma construida dentro del CLR que ofrece un conjunto único de características que no están disponibles en ningún otro lugar:
Canales
Son los que permiten el transporte de datos desde y hacia los objetos remotos, toda invocación y su correspondiente respuesta viaja por esta vía.
Se pueden utilizar 2 tipos de canales: HTTP ó TCP (mi preferido). El canal TCP tiene mucho mayor rendimiento ya que se conecta directamente a un socket indicado. El canal HTTP es mayormente utilizado por las comunicaciones por Internet.
Serialización
Para poder realizar la transferencia de los objetos por los canales estos primero deben ser transformados en un formato que pueda ser transportado e identificado desde el otro sitio, es allí donde entra la serialización.
Existen 2 formateadores predefinidos que pueden ser utilizados con el fin de serializar: SOAP ó Binario (aunque cada desarrollador puede también crear su propio formateador para utilizarlo con cualquier canal).
El canal HTTP utiliza de manera predeterminada el formateador SOAP y el canal TCP utiliza serialización binaria.
Objetos Proxy
Cuando un cliente crea una instancia de un objeto remoto recibe un proxy de la clase instanciada en el servidor. Desde la perspectiva del cliente esto no es tan diferente a realizar una llamada local.
Paso de Objetos
Para el paso de objetos es importante saber que todos los objetos creados remotamente deben heredar de MarshalByRefObject. Los objetos pasados como parámetros pueden ser pasados por valor o por referencia.
Tiempo de Vida
El tiempo de vida de un objeto es controlado por un mecanismo de leasing. Esta “licencia” tiene un tiempo permitido de uso, cuando el tiempo de la licencia llega a cero el objeto es desconectado y en la próxima pasada del Garbage Collector el objeto será destruido.
Hospedaje de Objetos en IIS
Los objetos remotos pueden ser hospedados en el IIS, lo que permite que cualquier cliente que utilice HTTP con el puerto correspondiente conectarse al objeto.
Modelos de Activación
SingleCall
- Es una tipo de activación de objetos que crea al objeto y lo destruye en cada llamada.
Singleton
- Los objetos Singleton dan servicio a múltiples clientes y comparten información entre las distintas invocaciones.
Client-Activated Objects
- Esta modalidad permite a la aplicación instanciar el objeto para su uso exclusivo. Cuando el cliente crea una instancia utilizando el operador "new" un pedido de activación es enviado al servidor. Luego el servidor crea el objeto y devuelve una referencia al mismo. Entonces en la aplicación cliente se crea un objeto proxy y todas las invocaciones de los métodos serán ejecutadas en el proxy.
¿Cómo trabaja?
Primero necesitamos saber que existen ciertas reglas que se deben aplicar:
1. Todos los objetos remotos deben heredar de MarshalByRefObject
2. Toda interacción con el objeto remoto ocurre por referencia a través de un Proxy. Los clientes deben obtener dicho Proxy activando un objeto remoto por medio de los modelos de activación antes descritos.
3. Objetos locales pueden ser pasados por valor como parámetro cuando se realiza una llamada remota.
4. Todos los objetos pasados por valor deben ser serializables, puede ser implementando la interfaz ISerializable ó marcando la clase con el atributo [serializable]
Ahora, existen 2 participantes en el concepto de .Net Remoting, Servidor y Cliente. El Servidor es quien va a escuchar los requerimientos de objetos del cliente.
Para desarrollar un servidor:
• Es necesario registrar todos los canales que los clientes utilizarán para comunicarse con el objeto, cada canal utiliza un protocolo específico.
• Se debe detallar cuales son las clases que se desean exponer en el servidor e indicar el tiempo de vida de los objetos.
• Listo, ahora el servidor puede empezar a escuchar las conexiones de los clientes.
Una vez que tenemos el servidor que expone los objetos los clientes pueden conectar e invocar métodos en el objeto servidor:
• El cliente registra un canal que será utilizado para la comunicación con el objeto remoto. (El servidor debe estar escuchando en el mismo canal)
• El cliente activa el objeto.
• Se provee información suficiente sobre el tipo y la localización del objeto remoto con el requerimiento de activación para que el .Net Framework cree el objeto Proxy que representa el objeto remoto. Es importante agregar que todo este proceso es local y que no se han realizado llamadas al objeto remoto. El objeto Proxy es almacenado en una tabla cualquier activación adicional hecha por el cliente recibe el mismo Proxy.
• En el caso de objetos activados por el servidor el cliente llama un método en el objeto remoto usando el Proxy que recibe en la activación. El canal cliente entonces intenta establecer una conexión con el canal remoto si no está conectado.
• Detalles del método llamado son cargados en un objeto Message que es serializado y transportado al servidor el tipo de serialización depende del canal.
• Una vez que el mensaje llega al servidor el .Net Framework rearma la llamada original activa el objeto destino si no está actualmente activado y reenvía la llamada al objeto. Un resultado regresa al cliente de manera opuesta a la llamada (el resultado es empaquetado en un Message que es enviado al cliente). Si el objeto destino es de tipo SingleCall será inmediatamente enviado al Garbage para que lo destruya.