Evitando que un Sigleton muera a los 5 minutos con Remoting

En .NET Remoting, al igual que en el resto de la infraestructura del framework, el recolector de basura se encarga de destruir objetos que ya no se utilizan, sin embargo en el caso de remoting el mecanismo es algo más complejo, debido a que las relaciones entre objetos cruzan dominios de aplicación.

Remoting dispone de una serie de funcionalidades orientadas a permitir la recolección de los objetos que se consideren no utilizados, basadas en lo que denominan «lease time», o «tiempo prestado». De manera resumida a cada objeto se le asigna automáticamente un tiempo de vida, típicamente 5 minutos que es prorrogado cada vez que se accede a él, aunque se dispone de una serie de interfaces y clases que permiten configurar y adaptar este mecanismo a nuestras necesidades.

En el caso de los objetos activados en servidor de tipo Singleton, lo que se pretende es garantizar que únicamente exista una instancia de él mientras dure la aplicación, por lo que la solución es bastante sencilla y se basa en sobrecargar el método InitializeLifetimeService de la clase MarshalByRefObject de forma que indique que el objeto no caduca nunca, devolviendo para ello el valor null.

public class RemotingSingleton: MarshalByRefObject 
{
  public override Object InitializeLifetimeService()
  {
    return null;
  }
}

En aquellos objetos que vayan a ser activados en modo servidor singleton, será suficiente con añadir este método para que el recolector de basura no destruya la instancia, independientemente de cuándo accedan los clientes a ella.

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

Un Comentario para “Evitando que un Sigleton muera a los 5 minutos con Remoting”

  1. Hola amigo, ojala pudieras ayudarme, tengo el siguiente escenario:
    1) Un servicio windows aloja a un objeto remoto que es expuesto mediante un canal tcp.
    2) El cliente es Web y esta alojado en IIS 6.
    3) En el objeto remoto, mediante una funcion, trata de recuperar el usuario cliente de la aplicacion web, mediante un codigo similar a:
    WindowsIdentity identity= (WindowsIdentity)Thread.CurrentPrincipal.Identity;

    using (WindowsImpersonationContext ctx = identity.Impersonate())
    {
    user
    Console.WriteLine(WindowsIdentity.GetCurrent().Name);
    }

    4) Sin embargo, me devuelve el usuario network services. En el web.config del cliente, tengo configurado mi ambiente mediante impersonate.

    Como puedo recuperar al usuario autentificado?. Muchisimas Gracias.