Compartir a través de


Activación del servidor

Los objetos activados en el servidor son aquellos cuya duración está controlada directamente por el servidor. El dominio de aplicación del servidor crea estos objetos únicamente cuando el cliente llama a un método en el objeto, y no cuando llama a new (New() en Visual Basic) o a Activator.GetObject; así se evita la necesidad de una acción de ida y vuelta por la red con el único propósito de crear una instancia. Sólo se crea un proxy en el dominio de aplicación de cliente cuando un cliente solicita una instancia de un tipo activado en el servidor. No obstante, otra consecuencia es que sólo se permiten constructores predeterminados para los tipos activados por el servidor cuando se utilizan las implementaciones predeterminadas. Para publicar un tipo cuyas instancias se crearán con constructores específicos que aceptan argumentos, puede utilizar la activación del cliente o puede publicar de manera dinámica su instancia particular.

Hay dos modos de activación (o valores WellKnownObjectMode) para los objetos activados por el servidor: Singleton ** y SingleCall.

Los tipos Singleton nunca tienen más de una instancia al mismo tiempo. Si existe una instancia, todas las solicitudes de clientes son atendidas por esa instancia. Si no existe ninguna, el servidor crea una y todas las solicitudes de cliente posteriores serán atendidas por esa instancia. Dado que los tipos Singleton tienen asociada una duración predeterminada, los clientes no siempre recibirán una referencia a la misma instancia de la clase utilizable de forma remota, incluso si nunca hay más de una instancia disponible al mismo tiempo.

Los tipos SingleCall siempre tienen una instancia por cada solicitud de cliente. La siguiente llamada a un método será atendida por otra instancia del servidor, aunque el sistema no haya reciclado todavía la instancia anterior. Los tipos SingleCall no participan en el sistema de concesión 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 mediante un archivo de configuración) y llaman a new, o bien pasan la configuración del objeto remoto en una llamada a Activator.GetObject.

**Nota   **Puede que no le haga falta registrar el canal en el cliente. Si el cliente no registra un canal, el sistema de interacción remota elige o crea uno automáticamente, para lo que usa uno de los canales predeterminados especificados en el archivo Machine.config con el fin de realizar las solicitudes salientes. Esta selección automática de canales en el cliente no registra el canal para escuchar las funciones de devolución de llamada procedentes del servidor y, a menos que se agregue dicho canal personalizado al archivo machine.config, no registra la implementación de ningún canal personalizado. En estos casos, debe registrar el tipo de canal que desea utilizar en el dominio de aplicación de cliente.

En el siguiente ejemplo de código, se muestra una llamada a Activator.GetObject, suponiendo que se ha registrado un TcpChannel para comunicar en el puerto 8080. Si el cliente sólo sabe que el objeto servidor implementa una interfaz determinada, es preciso utilizar una llamada a Activator.GetObject, ya que sólo se puede usar new (New en Visual Basic) para crear una instancia de una clase.

Dim MyRemoteClass As RemoteObjectClass = _
   CType( _
      Activator.GetObject(_
         GetType(RemoteObjectClass), _
         "tcp://computername:8080/RemoteObjectUri" _
      ), _
      RemoteObjectClass
   ) [C#]
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
   typeof(RemoteObjectClass),
   "tcp://computername:8080/RemoteObjectUri "
);

Recuerde que la llamada anterior no crea el objeto remoto en el servidor. Devuelve al cliente sólo una referencia al proxy local correspondiente al objeto remoto. A continuación, el cliente puede tratar MyRemoteClass como si fuera una referencia directa al objeto remoto. La instancia que el cliente utiliza realmente para comunicarse en cada llamada a un método depende de si el objeto de servidor se declara como tipo Singleton o SingleCall. Independientemente de si el editor del objeto servidor exponga esta información o no, el cliente trata exactamente igual la referencia al objeto que tiene.

Singleton

En COM, "singleton" significaba que mientras los clientes tuvieran referencias al objeto, éste no sería eliminado de la memoria. Sin embargo, en .NET remoting, un objeto Singleton depende de la concesión del período de duración que se le asignó, por lo que puede ser reciclado aunque haya clientes que en ese momento tengan referencias al mismo. Se puede crear el tipo anterior del objeto Singleton reemplazando el método InitializeLifetimeService de MarshalByRefObject de manera que se devuelva una referencia nula (Nothing en Visual Basic). Es una forma eficaz de conservar el objeto en la memoria mientras se esté ejecutando el dominio de aplicación host. Para obtener más información, vea Concesiones del período de duración. Se puede crear el segundo tipo de Singleton configurando el período de concesión inicial en el archivo de configuración de interacción remota.

Vea también

Activación | Activación del cliente | WellKnownObjectMode (Enumeración) | Activación | Concesiones del período de duración