Activación del servidor
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 objetos activados en el servidor son objetos cuyos períodos de duración están controlados directamente por el servidor. El dominio de aplicación del servidor solamente crea estos objetos cuando el cliente realiza una llamada al método en el objeto, en vez de cuando el cliente llama a nuevo (Nuevo () en Visual Basic) o a Activator.GetObject; esto evita un viaje de ida y vuelta por la red con el propósito de crear la instancia. En el dominio de aplicación cliente solamente se crea un proxy cuando un cliente solicita una instancia de un tipo activado en el servidor. Esto significa que solo los constructores predeterminados están permitidos para los tipos activados en el servidor. Para publicar un tipo cuyas instancias se crearán con constructores concretos que toman argumentos, puede utilizar Activación de cliente o puede publicar dinámicamente su instancia particular.
Modos de activación del servidor
Hay dos modos de activación (o valores WellKnownObjectMode) para los objetos activados en el servidor: Singleton y SingleCall.
Los tipos Singleton nunca tienen más de una instancia al mismo tiempo. Si existe una instancia, esa instancia atiende todas las solicitudes del cliente. Si no existe una instancia, el servidor crea una instancia y esa instancia atenderá todas las solicitudes siguientes del cliente. Dado que los tipos Singleton tienen un período de duración predeterminado asociado, los clientes no siempre recibirán una referencia a la misma instancia de la clase remota, aunque nunca haya más de una instancia disponible a la vez.
Los tipos SingleCall siempre tienen una instancia por solicitud de cliente. La próxima invocación de método se atenderá por una instancia de servidor diferente, aun cuando el sistema no haya reciclado todavía la instancia anterior. Los tipos SingleCall no participan en el sistema de concesiones del período de duración.
Para crear una instancia de un tipo activado en el servidor, los clientes configuran su aplicación mediante programación o utilizando un archivo de configuración. Al configurar una aplicación mediante programación utilice el método Activator.GetObject para crear instancias de un objeto activado en el servidor en el cliente. Al configurar una aplicación con un archivo de configuración usted puede llamar a Activator.GetObject o utilizar el nuevo operador para crear instancias de un objeto activado en el cliente.
Nota: |
---|
Podría no tener que registrar el canal en el lado del cliente. Si el cliente no registra un canal, el sistema remoto crea automáticamente un canal utilizando uno de los canales predeterminados especificado en el archivo Machine.config para realizar las solicitudes de salida. Esta selección automática de canal en el cliente no registra el canal para realizar escuchas para cualquier función de devolución de llamada desde el servidor y, a menos que ese canal personalizado se agregue al archivo machine.config, no registra ninguna implementación del canal personalizada. En estos casos, debe registrar el tipo de canal que desea utilizar en el dominio de aplicación del cliente. |
El siguiente ejemplo de código muestra una llamada a Activator.GetObject, asumiendo que TcpChannel se ha registrado para comunicar en el puerto 8080. Si su cliente solo conoce que el objeto de servidor implementa una interfaz determinada, debe utilizar una llamada a Activator.GetObject, porque solo puede utilizar nuevo (Nuevo en Visual Basic) para crear una instancia de una clase.
Dim MyRemoteClass As RemoteObjectClass = _
CType( _
Activator.GetObject(GetType(RemoteObjectClass), _
"tcp://computername:8080/RemoteObjectUri" ), _
RemoteObjectClass
)
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
typeof(RemoteObjectClass),
"tcp://computername:8080/RemoteObjectUri "
);
Tenga presente que en este punto todavía no se ha producido una comunicación real con el servidor, por lo que no se ha creado una instancia del propio objeto remoto. Pero sí se ha creado una instancia del objeto proxy en el lado del cliente. El cliente puede utilizar ahora MyRemoteClass
como si fuera una referencia directa al objeto remoto. La instancia RemoteObjectClass que el cliente realmente utiliza para comunicarse de una llamada de método a otra depende de si el objeto del servidor se declara como un tipo Singleton o uno SingleCall. Sin tener en cuenta si el publicador del objeto del servidor expone esta información, el cliente trata la referencia al objeto que tiene exactamente igual.
Singletons
En COM, el "singleton" significó que mientras los clientes tuvieran referencias a su objeto, el objeto no se eliminaría de la memoria. Sin embargo, en .NET Remoting, un objeto Singleton está sujeto a la concesión infinita que se le especificó, por lo que se puede reciclar aun cuando los clientes todavía tengan referencias a él. Puede crear el tipo anterior del objeto Singleton invalidando el método InitializeLifetimeService de MarshalByRefObject para devolver una referencia nula (Nada en Visual Basic). Esto mantiene eficazmente el objeto en memoria mientras se esté ejecutando el dominio de la aplicación host. Para obtener más detalles, vea Concesiones del período de duración. Puede crear el último tipo del objeto Singleton configurando el período de concesión inicial en el archivo de configuración remota.
Vea también
Referencia
WellKnownObjectMode Enumeration
Conceptos
Activación de los objetos remotos
Activación de cliente
Concesiones de duración