Baux de durée de vie

Cette rubrique est spécifique à la technologie héritée assurant la compatibilité descendante avec des applications existantes et n'est pas recommandée en cas de nouveau développement. Les applications distribuées doivent maintenant être développées à l'aide de  Windows Communication Foundation (WCF).

Les objets marshalés par référence (MBR) ne résident pas en mémoire éternellement, qu'il s'agisse d'objets Singleton activés par le serveur ou d'objets activés par le client. À moins que le type ne se substitue à MarshalByRefObject.InitializeLifetimeService pour contrôler ses propres stratégies de durée de vie, chaque MBR dispose d'une durée de vie contrôlée par une combinaison de baux, un gestionnaire de bail et plusieurs commanditaires. Dans ce cas, la durée de vie d'un objet MBR correspond à la durée totale pendant laquelle l'objet reste actif en mémoire. Un bail correspond à la période de temps pendant laquelle un objet particulier est actif en mémoire avant que le système .NET Framework Remoting ne commence à le supprimer pour récupérer la mémoire. Le gestionnaire de bail du domaine d'application serveur est l'objet qui détermine le moment où l'objet distant est marqué pour la garbage collection. Un commanditaire est un objet qui peut demander un nouveau bail pour un objet particulier en s'inscrivant auprès du gestionnaire de bail.

Dès qu'un objet MBR est sorti d'un domaine d'application, un bail de durée de vie est créé pour cet objet. Chaque domaine d'application contient un gestionnaire de bail responsable de l'administration des baux de son domaine. Le gestionnaire de bail contrôle périodiquement l'ensemble des baux pour détecter une éventuelle expiration. Si un bail a expiré, le gestionnaire de bail envoie une demande à sa liste de commanditaires pour savoir si l'un d'entre eux souhaite renouveler le bail. Si aucun commanditaire ne renouvelle le bail, le gestionnaire de bail supprime le bail, l'objet est supprimé et sa mémoire est libérée par la garbage collection. La durée de vie d'un objet peut donc être beaucoup plus longue que son bail de durée de vie si ce dernier est renouvelé plus d'une fois par un commanditaire ou si l'objet est continuellement appelé par des clients.

La vie d'un objet distant est indépendante de la vie de ses clients. Le bail d'un objet de base peut être très long, auquel cas l'objet peut être utilisé par plusieurs clients. Le bail de l'objet peut être renouvelé régulièrement par un client, gardant ainsi l'objet actif plus longtemps. Cette approche utilise les baux efficacement, car la garbage collection distribuée requiert très peu de trafic réseau. Toutefois, les objets distants qui utilisent des ressources rares peuvent avoir un bail court, qu'un client renouvelle fréquemment. Lorsque tous les clients en ont terminé avec l'objet distant, le système .NET Framework Remoting marque rapidement l'objet pour le garbage collection. Cette stratégie est un compromis entre trafic réseau en hausse et utilisation plus efficace de ressources du serveur.

L'utilisation de baux pour gérer la durée de vie d'objets distants est une approche alternative au décompte de références, qui peut être complexe et inefficace sur des connexions réseau peu fiables. Bien que les baux puissent être configurés de façon à étendre la durée de vie d'un objet distant pour qu'elle soit plus longue que nécessaire, la réduction du trafic réseau consacré au décompte de références et à l'envoi des demandes aux clients rend le système de baux intéressant pour certains scénarios lorsqu'il est correctement configuré.

Le tableau suivant décrit les propriétés principales des baux.

Propriété Description

InitialLeaseTime

Spécifie la durée initiale pendant laquelle un objet reste en mémoire avant que le gestionnaire de bail ne commence à le supprimer. Dans le fichier de configuration, il s'agit de l'attribut leaseTime de l'élément de configuration Élément <lifetime>. La valeur par défaut est 5 minutes. Une heure de bail de 0 équivaut à une durée de vie infinie.

CurrentLeaseTime

Spécifie le temps restant avant l'expiration du bail. Lorsqu'un bail est renouvelé, son CurrentLeaseTime a pour valeur le maximum du CurrentLeaseTime ou du RenewOnCallTime.

RenewOnCallTime

Spécifie l'intervalle de temps auquel est défini le CurrentLeaseTime après chaque appel distant à l'objet. La valeur par défaut est 2 minutes.

SponsorshipTimeout

Spécifie la durée pendant laquelle le gestionnaire de bail attend une réponse du commanditaire une fois que l'expiration du bail a été notifiée. Si le commanditaire ne répond pas dans le délai spécifié, il est supprimé et un autre commanditaire est appelé. S'il n'y a plus de commanditaire, le bail expire et l'objet distant est marqué pour une opération garbage collection. Si la valeur est 0 (TimeSpan.Zero), le bail n'inscrit aucun commanditaire. La valeur par défaut est 2 minutes.

LeaseManagerPollTime

Spécifie la durée pendant laquelle le gestionnaire de bail est mis en veille après avoir vérifié les baux expirés. La valeur par défaut est 10 secondes.

Les baux sont créés lorsqu'un objet MBR est activé dans un autre domaine d'application. À ce stade, lorsque la propriété ILease.CurrentState a la valeur LeaseState.Initial, les propriétés de bail peuvent être définies. Une fois définies, elles ne peuvent pas être modifiées directement. Seul le CurrentLeaseTime peut être modifié, soit à partir d'un appel ILease.Renew, soit lorsque le gestionnaire de bail appelle ISponsor.Renewal sur un commanditaire et que ce dernier répond par un objet TimeSpan. MarshalByRefObject dispose de l'implémentation par défaut d'un bail de durée de vie et les propriétés du bail restent identiques sauf si le bail est modifié lors de sa création.

Modification des propriétés de bail

Les propriétés du bail de durée de vie peuvent être modifiées comme suit :

  • En déclarant des propriétés de bail de durée de vie personnalisées en substituant MarshalByRefObject.InitializeLifetimeService dans votre objet MBR, soit pour définir les propriétés sur le bail vous-même, soit pour retourner une référence Null (Nothing en Visual Basic). Cette dernière option informe le système .NET Framework Remoting que les instances de ce type ont une durée de vie infinie.

  • Un développeur ou un administrateur peut également spécifier des propriétés de durée de vie pour tous les objets d'une application particulière dans l'élément Élément <lifetime> dans le fichier de configuration de l'application ou de l'ordinateur. Pour plus d'informations, consultez Initialisation de baux.

Une fois créé, un bail peut être renouvelé comme suit :

  • Un client appelle directement Renew.

  • Si la propriété ILease.RenewOnCallTime est définie, chaque appel à l'objet distant renouvelle le bail pour la durée spécifiée.

  • Le bail appelle une méthode Renewal pour demander un renouvellement de bail et le commanditaire répond par TimeSpan.

Pour plus d'informations, consultez Renouvellement de baux.

Gestionnaires de bail

Les gestionnaires de bail doivent contrôler périodiquement les baux pour détecter une éventuelle expiration. Lorsque la durée de vie d'un bail expire, le bail en est informé et il essaie de le renouveler en appelant ses commanditaires.

Le gestionnaire de bail maintient également une liste des commanditaires dont les baux attendent des réponses. Si un commanditaire ne répond pas dans l'intervalle spécifié par SponsorshipTimeout, il est supprimé de la liste des commanditaires.

Notez qu'il est possible pour un client de communication à distance malveillant de tromper le système de baux pour monter une attaque par déni de service (DOS) contre un serveur de communication à distance. Le client malveillant commandite de nombreux baux, puis refuse de répondre aux demandes de renouvellement du serveur. Cette attaque DOS n'est possible que si TypeFilterLevel a la valeur full.

Lorsqu'un bail est autorisé à expirer, aucun message de bail ni de retour de commanditaire n'est accepté. La référence du bail est supprimée de la liste de baux et le système .NET Framework Remoting supprime la référence d'objet de sa table interne. Le système de garbage collection supprime ensuite le bail et l'objet.

Voir aussi

Tâches

Comment : substituer l'interface InitializeLifetimeService
Comment : renouveler un bail

Référence

Schéma des paramètres de communication à distance
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

Concepts

Exemple de communication à distance : durées de vie
Initialisation de baux
Renouvellement de baux

Autres ressources

Activation d'objets et durées de vie