Concesiones de duración

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 de cálculo por referencia (MBR) no residen de forma ilimitada en la memoria, ya sean objetos Singleton activados en el servidor u objetos activados en el cliente. En su lugar, a menos que el tipo invalide MarshalByRefObject.InitializeLifetimeService.InitializeLifetimeService para controlar sus propias directivas del período de duración, cada MBR tiene una duración controlada por una combinación de concesiones, un administrador de concesiones y varios patrocinadores. En este caso, la duración de un objeto MBR es el tiempo total que el objeto permanece activo en la memoria. Una concesión es el período de tiempo que un objeto determinado está activo en la memoria antes de que el sistema remoto de .NET Framework comience el proceso de eliminarlo y reclamar la memoria. El administrador del dominio de la aplicación de servidor es el objeto que determina cuando el objeto remoto se marca para la recolección de elementos no utilizados. Un patrocinador es un objeto que puede solicitar una nueva concesión para un objeto determinado registrándose con el administrador de concesiones.

Cuando un objeto MBR se transmite de forma remota fuera de un dominio de aplicación, se crea una concesión infinita para ese objeto. Cada dominio de aplicación contiene un administrador de concesiones que es responsable de administrar las concesiones en su dominio. El administrador de concesiones examina con regularidad todas las concesiones en busca de períodos de duración vencidos. Si una concesión ha expirado, el administrador de concesiones envía una solicitud a su lista de patrocinadores para ese objeto y consulta si cualquiera de ellos confirma renovar la concesión. Si ningún patrocinador renueva la concesión, el administrador de concesiones elimina la concesión, se elimina el objeto y la recolección de elementos no utilizados reclama su memoria. Entonces, la duración del objeto puede ser más duradera que su período de concesión, si un patrocinador la renueva más de una vez o si los clientes lo llaman continuamente1.

El período de duración de un objeto remoto es independiente de la duración de sus clientes. La concesión para un objeto básico puede ser muy larga, en cuyo caso varios clientes pueden utilizar el objeto. Un cliente puede renovar periódicamente la concesión del objeto manteniendo el objeto vivo durante mucho más tiempo. Este enfoque utiliza eficazmente las concesiones, puesto que se requiere un tráfico de red muy pequeño para la recolección de elementos no utilizados distribuida. Sin embargo, los objetos remotos que utilizan recursos escasos pueden tener una concesión con una duración corta, que un cliente renueva con frecuencia con un intervalo de tiempo corto. Cuando todos los clientes han terminado con el objeto remoto, el sistema remoto de .NET Framework marca rápidamente el objeto para la recolección de elementos no utilizados. Esta directiva sustituye el tráfico de red aumentado para un uso más eficaz de recursos del servidor.

Utilizar las concesiones para administrar la duración de objetos remotos es un enfoque alternativo al recuento de referencias, que puede ser complejo e ineficaz en las conexiones de red no fidedignas. Aunque las concesiones se pueden configurar para extender la duración de un objeto remoto mucho más tiempo del que precisamente se requiere, la reducción en el tráfico de red consagrado al recuento de referencias y al envío de solicitudes a los clientes convierte a las concesiones en una solución atractiva cuando éstas están correctamente configuradas para un escenario determinado.

En la tabla siguiente se describen las propiedades principales de las concesiones.

Propiedad Descripción

InitialLeaseTime

Especifica el período inicial de tiempo que un objeto permanece en la memoria antes de que el administrador de concesiones comience el proceso de eliminación del objeto. En el archivo de configuración, esto es el atributo leaseTime del elemento de configuración <lifetime> (Elemento). El valor predeterminado es 5 minutos. Un período de concesión de 0 establece la concesión de una duración infinita.

CurrentLeaseTime

Especifica el período de tiempo antes de que la concesión expira. Cuando se renueva una concesión, su CurrentLeaseTime está establecido al máximo de CurrentLeaseTime o RenewOnCallTime.

RenewOnCallTime

Especifica el intervalo de tiempo máximo que se establece a CurrentLeaseTime después de cada llamada remota al objeto. El valor predeterminado es 2 minutos.

SponsorshipTimeout

Especifica el tiempo que el administrador de concesiones espera la respuesta del patrocinador cuando se le notifica el vencimiento de una concesión. Si el patrocinador no responde en el tiempo especificada, se quita al patrocinador y se llama a otro patrocinador. Si no hay más patrocinadores, la concesión expira y el objeto remoto se marca para la recolección de elementos no utilizados. Si el valor es 0 (TimeSpan.Zero), la concesión no registra a ningún patrocinador. El valor predeterminado es 2 minutos.

LeaseManagerPollTime

Especifica el intervalo de tiempo durante el cual el administrador de concesiones permanece inactivado tras comprobar la presencia de concesiones vencidas. El valor predeterminado es 10 segundos.

Las concesiones se crean cuando un objeto MBR se activa en otro dominio de aplicación. Llegado ese punto, cuando la propiedad ILease.CurrentState es LeaseState.Initial, se pueden establecer las propiedades de concesión. Una vez establecidas, no se pueden cambiar directamente. Solo se puede cambiar CurrentLeaseTime desde una llamada de ILease.Renew o cuando el administrador de concesiones llama a ISponsor.Renewal en un patrocinador y el patrocinador responde con un objeto a TimeSpan. MarshalByRefObject tiene la implementación predeterminada de una concesión infinita y a menos que se modifique esta concesión cuando se crea, las propiedades de concesión siempre son las mismas.

Modificar la propiedades de concesión

Las propiedades de concesión del período de tiempo se pueden modificar de las siguientes formas:

  • Declarando la propiedades de concesión infinitas personalizadas invalidando MarshalByRefObject.InitializeLifetimeService en su objeto MBR, para establecer las propiedades en la concesión usted mismo o volver a una referencia null (Nothing en Visual Basic). La última opción indica al sistema remoto de .NET Framework que las instancias de este tipo tienen una duración infinita.

  • Un programador o un administrador también pueden especificar las propiedades del período de concesión para todos los objetos de una aplicación determinada en el elemento <lifetime> (Elemento) en el archivo de configuración del equipo o en el de la aplicación. Para obtener más información, vea Inicializar las concesiones.

Una vez creada, una concesión se puede renovar de las siguientes formas:

  • Un cliente llama directamente aRenew.

  • Si se establece la propiedad ILease.RenewOnCallTime, cada llamada al objeto remoto renueva la concesión durante el tiempo especificado.

  • La concesión llama a un método Renewal para solicitar una renovación de la concesión y el patrocinador responde con TimeSpan.

Para obtener información detallada, vea Renovar las concesiones.

Administrador de concesiones

El administrador de concesiones debe examinar con regularidad las concesiones en busca de vencimientos. Cuando el período de una concesión ha expirado, se informa a la concesión y ésta intenta renovarse invocando a sus patrocinadores.

Asimismo, el administrador de concesiones mantiene una lista de patrocinadores a partir de la cual las concesiones esperan a las respuestas. Si un patrocinador no responde en el intervalo especificado por el intervalo de tiempo SponsorshipTimeout, se quita de la lista de patrocinadores.

Observe que es posible que un cliente remoto malintencionado abuse del sistema de concesiones para montar un ataque por denegación de servicio (DOS) contra un servidor remoto. El cliente malintencionado patrocina muchas concesiones y, a continuación, rechaza responder a las consultas de renovación del servidor. Este ataque de DOS solo es posible si TypeFilterLevel se establece a lleno.

Cuando una concesión puede expirar, ya no se aceptan mensajes de concesiones ni retornos del patrocinador. La referencia de la concesión se quita de la lista de concesiones y el sistema remoto de .NET Framework quita la referencia al objeto de su tabla interna. A continuación, el sistema de recolección de elementos no utilizados quita la concesión y el objeto.

Vea también

Tareas

Cómo: Invalidar la interfaz InitializeLifetimeService
Cómo: Renovar una concesión

Referencia

Esquema de configuración de la comunicación remota
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

Conceptos

Ejemplo de comunicación remota: duraciones
Inicializar las concesiones
Renovar las concesiones

Otros recursos

Activación de objeto y duraciones