Lebensdauerleases

Dieses Thema bezieht sich auf eine veraltete Technologie, die zum Zwecke der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten wird und nicht für die neue Entwicklung empfohlen wird. Verteilte Anwendungen sollten jetzt mit  Windows Communication Foundation (WCF) entwickelt werden.

Marshal-by-Reference-Objekte (MBR-Objekte) befinden sich nicht auf Dauer im Speicher, unabhängig davon, ob es sich dabei um vom Server aktivierte Singleton-Objekte oder um vom Client aktivierte Objekte handelt. Stattdessen verfügt jedes MBR-Objekt, sofern der Typ zum Steuern seiner eigenen Lebensdauerrichtlinien nicht MarshalByRefObject.InitializeLifetimeService überschreibt, über eine Lebensdauer, die durch eine Kombination aus Leases, einem Lease-Manager und eine Reihe von Sponsoren gesteuert wird. In diesem Fall ist die Lebensdauer eines MBR-Objekts die Gesamtzeit, die das Objekt im Arbeitsspeicher aktiv bleibt. Eine Lease ist die Zeitspanne, die ein bestimmtes Objekt im Speicher aktiv ist. Nach dieser Zeitspanne startet das .NET Framework-Remotesystem den Vorgang für das Löschen des Objekts und das erneute Bereitstellen des Speichers. Der Lease-Manager der Serveranwendungsdomäne ist das Objekt, das bestimmt, wann das Remoteobjekt für die Garbage Collection markiert wird. Ein Sponsor ist ein Objekt, das eine neue Lease für ein bestimmtes Objekt anfordern kann, indem es sich beim Lease-Manager registriert.

Jedes Mal, wenn ein MBR-Objekt außerhalb einer Anwendungsdomäne remote verwendet wird, wird für dieses Objekt eine Lebensdauerlease erstellt. Jede Anwendungsdomäne enthält einen Lease-Manager, der für die Verwaltung der Leases in seiner Domäne zuständig ist. Der Lease-Manager überprüft alle Leases regelmäßig auf deren Ablauf. Wenn eine Lease abgelaufen ist, sendet der Lease-Manager eine Anforderung an seine Liste mit Sponsoren für dieses Objekt und fragt, ob einer der Sponsoren die Lease erneuern möchte. Wenn kein Sponsor die Lease erneuert, wird die Lease vom Lease-Manager entfernt, das Objekt wird gelöscht, und sein Speicher wird von der Garbage Collection zurückgefordert. Die Lebensdauer eines Objekts kann viel länger sein als seine Lebensdauerlease, wenn sie von einem Sponsor mehrmals erneuert oder wenn das Objekt weiterhin von Clients aufgerufen wird.

Die Lebensdauer eines Remoteobjekts ist von der Lebensdauer seiner Clients unabhängig. Die Lease für ein Basisobjekt kann sehr lang sein. In diesem Fall kann das Objekt von mehreren Clients verwendet werden. Die Lease des Objekts kann von einem Client regelmäßig erneuert werden, sodass das Objekt länger erhalten bleibt. Bei dieser Methode werden Leases effizient verwendet, da für eine verteilte Garbage Collection sehr wenig Netzwerkverkehr erforderlich ist. Allerdings können Remoteobjekte, die nur wenige Ressourcen nutzen, eine Lease mit einer kurzen Lebensdauer haben, die der Client häufig für einen kurzen Zeitraum erneuert. Wenn das Remoteobjekt von keinem Client mehr benötigt wird, markiert das .NET Framework-Remotesystem das Objekt schnell für die Garbage Collection. Diese Richtlinie ersetzt die effizientere Verwendung von Serverressourcen durch einen erhöhten Netzwerkverkehr.

Die Verwendung von Leases zum Verwalten der Lebensdauer von Remoteobjekten ist eine alternative Methode zur Verweiszählung, die über unzuverlässige Netzwerkverbindungen komplex und ineffizient sein kann. Obwohl Leases so konfiguriert werden können, dass die Lebensdauer eines Remoteobjekts über die exakt erforderliche Lebensdauer hinaus verlängert wird, macht die Verringerung des Netzwerkdatenverkehrs, der durch die Verweiszählung und das Senden von Anforderungen an Clients entsteht, das Leasing zu einer attraktiven Lösung, wenn es für ein bestimmtes Szenario richtig konfiguriert ist.

Die folgende Tabelle beschreibt die Haupteigenschaften von Leases.

Eigenschaft Beschreibung

InitialLeaseTime

Gibt die anfängliche Zeitspanne an, die ein Objekt im Speicher bleibt. Nach dieser Zeitspanne startet der Lease-Manager den Vorgang für das Löschen des Objekts. In der Konfigurationsdatei ist dies das leaseTime-Attribut des <lifetime>-Element-Konfigurationselements. Der Standardwert beträgt 5 Minuten. Eine Leasedauer von 0 (Null) legt die Lease auf eine unendliche Lebensdauer fest.

CurrentLeaseTime

Gibt die Zeitspanne an, die bis zum Ablauf der Lease verbleibt. Beim Erneuern einer Lease wird CurrentLeaseTime auf das Maximum von CurrentLeaseTime oder auf RenewOnCallTime festgelegt.

RenewOnCallTime

Gibt die maximale Zeitspanne an, auf die CurrentLeaseTime nach jedem Remoteaufruf für das Objekt festgelegt wird. Der Standardwert beträgt zwei Minuten.

SponsorshipTimeout

Gibt an, wie lange der Lease-Manager auf eine Antwort vom Sponsor wartet, wenn er über den Ablauf einer Lease benachrichtigt wird. Wenn der Sponsor nicht innerhalb des angegebenen Zeitintervalls antwortet, wird der Sponsor entfernt, und ein anderer Sponsor wird aufgerufen. Wenn keine weiteren Sponsoren vorhanden sind, läuft die Lease ab, und das Remoteobjekt wird für die Garbage Collection markiert. Wenn der Wert 0 (TimeSpan.Zero) ist, registriert die Lease keine Sponsoren. Der Standardwert beträgt zwei Minuten.

LeaseManagerPollTime

Gibt an, wie lange der Lease-Manager im Ruhezustand ist, nachdem er eine Überprüfung auf abgelaufene Leases durchgeführt hat. Der Standardwert beträgt 10 Sekunden.

Leases werden erstellt, wenn ein MBR-Objekt in einer anderen Anwendungsdomäne aktiviert wird. An diesem Punkt können die Leaseeigenschaften festgelegt werden, wenn die ILease.CurrentState-Eigenschaft LeaseState.Initial ist. Die Eigenschaften können nach deren Festlegung nicht mehr direkt geändert werden. Lediglich CurrentLeaseTime kann geändert werden, und zwar entweder über einen ILease.Renew-Aufruf oder über den Lease-Manager, wenn dieser ISponsor.Renewal für einem Sponsor aufruft und der Sponsor mit einem TimeSpan-Objekt antwortet. MarshalByRefObject verfügt über die Standardimplementierung einer Lebensdauerlease, und die Leaseeigenschaften sind immer gleich, es sei denn, die Lease wird bei ihrer Erstellung geändert.

Ändern von Leaseeigenschaften

Die Eigenschaften von Lebensdauerleases können auf folgenden Arten geändert werden:

  • Durch Deklarieren benutzerdefinierter Eigenschaften für die Lebensdauerlease, indem MarshalByRefObject.InitializeLifetimeService im MBR-Objekt überschrieben wird, um entweder die Eigenschaften für die Lease festzulegen oder um einen null-Verweis (Nothing in Visual Basic) zurückzugeben. Bei der als letztes genannten Möglichkeit wird dem .NET Framework-Remotesystem mitgeteilt, dass Instanzen dieses Typs eine unbegrenzte Lebensdauer haben.

  • Entwickler oder Administratoren können die Lebensdauereigenschaften für alle Objekte einer bestimmten Anwendung auch im <lifetime>-Element-Element der Anwendungs- oder Computerkonfigurationsdatei angeben. Weitere Informationen finden Sie unter Initialisieren von Leases.

Nach der Erstellung kann eine Lease auf folgende Arten erneuert werden:

  • Ein Client ruft Renew direkt auf.

  • Wenn die ILease.RenewOnCallTime-Eigenschaft festgelegt ist, wird die Lease bei jedem Aufruf des Remoteobjekts um die angegebene Zeit verlängert.

  • Die Lease ruft zur Erneuerung einer Lease eine Renewal-Methode auf, und der Sponsor antwortet mit TimeSpan.

Ausführliche Informationen finden Sie unter Erneuern von Leases.

Lease-Manager

Lease-Manager müssen Leases regelmäßig auf deren Ablauf hin überprüfen. Wenn die Leasedauer einer Lease abgelaufen ist, wird die Lease benachrichtigt. Die Lease versucht daraufhin, sich selbst zu erneuern, indem sie ihre Sponsoren aufruft.

Der Lease-Manager verwaltet außerdem eine Liste mit Sponsoren, von denen Leases auf Antworten warten. Wenn ein Sponsor nicht innerhalb des von der SponsorshipTimeout-Zeitspanne angegebenen Zeitraums antwortet, wird er aus der Liste entfernt.

Beachten Sie, dass ein böswilliger Remoteclient das Leasesystem missbrauchen kann, um einen Denial-of-Service-Angriff (DoS-Angriff) auf einen Remoteserver zu starten. Der böswillige Client sponsert viele Leases und lehnt es dann ab, die Erneuerungsabfragen des Servers zu beantworten. Dieser DoS-Angriff ist nur möglich, wenn TypeFilterLevel auf full festgelegt wird.

Wenn eine Lease ablaufen darf, werden keine weiteren Leasemeldungen oder Sponsorrückgaben akzeptiert. Der Verweis der Lease wird aus der Liste mit den Leases entfernt, und das .NET Framework-Remotesystem entfernt den Objektverweis aus seiner internen Tabelle. Danach entfernt das Garbage Collection-System die Lease und das Objekt.

Siehe auch

Aufgaben

Vorgehensweise: Überschreiben der InitializeLifetimeService-Schnittstelle
Vorgehensweise: Erneuern einer Lease

Verweis

Schema für Remoteeinstellungen
ILease
RemotingServices.GetLifetimeService
MarshalByRefObject.InitializeLifetimeService

Konzepte

Remotingbeispiel: Lebensdauer
Initialisieren von Leases
Erneuern von Leases

Weitere Ressourcen

Objektaktivierung und Lebensdauer