Share via


Arquitectura de .NET Remoting

La infraestructura de .NET remoting es un enfoque abstracto de la comunicación entre procesos. La mayor parte del sistema funciona sin llamar la atención. Por ejemplo, los objetos que se pueden pasar por valor, o copiar, se pasan automáticamente de una aplicación a otra en dominios de aplicación o en equipos distintos. Sólo tiene que marcar sus clases personalizadas como serializables para que el sistema funcione.

Pero la verdadera ventaja del sistema de interacción remota es su capacidad para permitir la comunicación entre objetos pertenecientes a dominios de aplicación o a procesos distintos mediante diferentes protocolos de transporte, formatos de serialización, esquemas de duración de objetos y modos de creación de objetos. Además, la interacción remota permite intervenir en prácticamente todas las fases del proceso de comunicación, sea cual sea la razón.

Tanto si implementó una serie de aplicaciones distribuidas como si sólo desea mover componentes a otros equipos para aumentar la escalabilidad de su programa, le resultará más fácil si considera el sistema de interacción remota como un sistema genérico de comunicación entre procesos con algunas implementaciones predeterminadas capaces de controlar fácilmente la mayoría de los escenarios posibles. La explicación siguiente comienza con los principios básicos de la comunicación entre procesos mediante la interacción remota.

Copias y referencias

La comunicación entre procesos requiere un objeto servidor cuya funcionalidad esté a disposición de los llamadores fuera de su proceso, un cliente que realice llamadas al objeto servidor y un mecanismo de transporte que lleve las llamadas de un extremo a otro. Las direcciones de los métodos del servidor son lógicas y funcionan correctamente en un proceso, pero no funcionan en otro proceso de cliente. Para solucionar este problema, el cliente puede llamar a un objeto servidor realizando una copia de todo el objeto y pasándola al proceso de cliente, donde se pueden invocar directamente los métodos de la copia.

No obstante, muchos objetos no se pueden o no se deben copiar ni pasar a otros procesos para ejecutarse. Los objetos sumamente grandes con muchos métodos son los menos aconsejables para copiar o pasar por valor a otros procesos. Normalmente, un cliente sólo necesita la información devuelta por un solo método o por unos pocos en el objeto servidor. Copiar el objeto servidor entero, incluyendo lo que podrían ser enormes cantidades de información interna o estructuras ejecutables no relacionadas con las necesidades del cliente, supondría desperdiciar el ancho de banda así como la memoria del cliente y el tiempo que se emplea en procesarlo todo. Además, muchos objetos exponen una funcionalidad pública pero requieren datos privados para la ejecución interna. Copiar estos objetos podría permitir que clientes no autorizados examinaran datos internos, lo que posibilitaría la aparición de problemas de seguridad. Por ultimo, algunos objetos utilizan datos que no se pueden copiar de ninguna forma comprensible. Por ejemplo, un objeto FileInfo contiene una referencia a un archivo de sistema operativo que tiene una dirección exclusiva en la memoria del proceso del servidor. Puede copiar esta dirección, pero nunca tendrá sentido en otro proceso.

En estos casos, el proceso del servidor debería pasar al proceso del cliente una referencia al objeto servidor, en lugar de una copia del objeto. Los clientes pueden utilizar esta referencia para llamar al objeto del servidor. Estas llamadas no se ejecutan en el proceso del cliente. En vez de eso, el sistema de interacción remota reúne toda la información referente a la llamada y la envía al proceso del servidor, donde se interpreta, se busca el objeto del servidor correcto y se realiza la llamada a dicho objeto en nombre del objeto del cliente. A continuación, se devuelve el resultado de la llamada al proceso del cliente para que se lo devuelva a su vez al cliente. El ancho de banda se utiliza únicamente para la información esencial: la llamada, sus argumentos y todas las excepciones o valores devueltos.

Arquitectura simplificada de interacción remota

El uso de referencias a objetos para la comunicación entre objetos de servidor y clientes es la esencia de la interacción remota. No obstante, la arquitectura de interacción remota proporciona al programador un procedimiento aún más sencillo. Si configura correctamente el cliente, sólo tiene que crear una nueva instancia del objeto remoto mediante new (o la función de creación de instancias del lenguaje de programación administrado que utilice). Su cliente recibe una referencia al objeto de servidor, lo que le permite llamar a sus métodos como si el objeto estuviera en su proceso en lugar de estar ejecutándose en otro equipo. El sistema de interacción remota utiliza objetos proxy para dar la impresión de que el objeto del servidor se encuentra en el proceso del cliente. Los objetos proxy son objetos complementarios, que se presentan como si fueran otro objeto. Cuando un cliente crea una instancia del tipo remoto, la infraestructura de interacción remota crea un objeto proxy que, para su cliente, tiene exactamente la misma apariencia que el tipo remoto. Su cliente llama a un método en ese objeto proxy y el sistema de interacción remota recibe la llamada, la dirige hacia el proceso del servidor, invoca al objeto de servidor y envía el valor devuelto al objeto proxy del cliente, que a su vez devuelve el resultado al cliente.

Las llamadas remotas deben ser transmitidas de alguna forma entre el cliente y el proceso del servidor. Si crea un sistema de interacción remota por su cuenta, podría empezar aprendiendo programación de redes y una amplia gama de protocolos y especificaciones de formatos de serialización. En el sistema .NET remoting, la combinación de tecnologías subyacentes necesarias para abrir una conexión de red y utilizar un determinado protocolo para enviar los bytes a la aplicación receptora se representa como un canal de transporte.

Un canal es un tipo que toma una secuencia de datos, crea un paquete según un determinado protocolo de red y lo envía a otro equipo. Algunos canales sólo pueden recibir información, otros sólo pueden enviarla y otros, como las clases predeterminadas TcpChannel y HttpChannel, se pueden utilizar en ambos sentidos.

Aunque el proceso del servidor conoce perfectamente todos los tipos, el cliente sólo sabe que necesita una referencia a un objeto de otro dominio de aplicación, puede que de otro equipo. Desde el exterior del dominio de aplicación de servidor, una dirección URL ubica el objeto. Las direcciones URL que representan tipos únicos para el mundo exterior son direcciones URL de activación, que garantizan que su llamada remota va dirigida al tipo apropiado. Para obtener más información, vea Direcciones URL de activación.

Diseño completo de un sistema de interacción remota

Imagine que en su equipo se ejecuta una aplicación y desea utilizar la funcionalidad expuesta por un tipo almacenado en otro equipo. En la ilustración siguiente se muestra el proceso general de interacción remota.

Proceso de interacción remota

Si ambas partes de la relación están configurados correctamente, un cliente se limita a crear una nueva instancia de la clase de servidor. El sistema de interacción remota crea un objeto proxy que representa a la clase y devuelve al objeto del cliente una referencia al objeto proxy. Cuando un cliente llama a un método, la infraestructura de interacción remota controla la llamada, comprueba el tipo de información y dirige la llamada por el canal hacia el proceso del servidor. Un canal a la escucha detecta la solicitud y la reenvía al sistema de interacción remota del servidor, que a su vez busca (o crea, si es necesario) y llama al objeto solicitado. A continuación el proceso se invierte: el sistema de interacción remota del servidor incluye la respuesta en un mensaje que el canal del servidor envía al canal del cliente. Por último, el sistema de interacción remota del cliente devuelve el resultado de la llamada al objeto del cliente a través del objeto proxy.

Para que esto funcione se necesita muy poco código propiamente dicho, pero es conveniente reflexionar un poco sobre el diseño y la configuración de la relación. El código puede ser totalmente correcto y aún así no funcionar porque una dirección URL o un número de puerto no lo sean. Para obtener más información, vea Configuración.

Aunque esta información general del proceso básico de interacción remota es bastante sencilla, los detalles de los niveles inferiores pueden resultar muy complejos. En otros temas, como los indicados a continuación, se describen con más detalle los elementos principales de la interacción remota.

Vea también

Información general de .NET Remoting | Límites: Procesos y dominios de aplicación | Objetos utilizables y no utilizables de forma remota | Periodos de duración y activación de los objetos | Canales | Seguridad | Configuración