Freigeben über


Serveraktivierung

Vom Server aktivierte Objekte sind Objekte, deren Lebensdauer direkt vom Server gesteuert wird. Die Serveranwendungsdomäne erstellt diese Objekt nur, wenn der Client einen Methodenaufruf für das Objekt durchführt, und nicht, wenn der Client new (New() in Visual Basic) oder Activator.GetObject aufruft. Damit wird ein Netzwerkroundtrip gespeichert, der lediglich der Instanzenerstellung dient. In der Clientanwendungsdomäne wird nur dann ein Proxy erstellt, wenn ein Client eine Instanz eines vom Server aktivierten Typs anfordert. Dies bedeutet, dass nur Standardkonstruktoren für vom Server aktivierte Typen zulässig sind. Zum Veröffentlichen eines Typs, dessen Instanzen mit bestimmten Konstruktoren erstellt werden, die Argumente annehmen, können Sie die Clientaktivierung verwenden oder die spezielle Instanz dynamisch veröffentlichen.

Serveraktivierungsmodi

Für vom Server aktivierte Objekte gibt es zwei Aktivierungsmodi (oder WellKnownObjectMode-Werte): Singleton und SingleCall.

Singleton-Typen haben immer nur eine Instanz. Wenn eine Instanz vorhanden ist, werden alle Clientanforderungen von dieser Instanz bedient. Ist keine Instanz vorhanden, erstellt der Server eine Instanz, die alle nachfolgenden Clientanforderungen bedient. Da Singleton-Typen eine Standardlebensdauer zugeordnet ist, erhalten Clients nicht immer einen Verweis auf dieselbe Instanz der remotefähigen Klasse, auch wenn nie mehr als eine Instanz verfügbar ist.

SingleCall-Typen haben immer eine Instanz pro Clientanforderung. Der nächste Methodenaufruf wird von einer anderen Serverinstanz verarbeitet, auch wenn die vorhergehende Instanz noch nicht vom System wiederverwendet wurde. SingleCall-Typen nehmen nicht am Leasesystem für die Lebensdauer teil.

Um eine Instanz eines vom Server aktivierten Typs zu erstellen, konfigurieren Clients ihre Anwendung entweder programmgesteuert oder mit einer Konfigurationsdatei. Wenn Sie eine Anwendung programmgesteuert konfigurieren, instanziieren Sie ein vom Server aktiviertes Objekt mit der Activator.GetObject-Methode auf dem Client. Wenn Sie eine Anwendung mit einer Konfigurationsdatei konfigurieren, können Sie entweder Activator.GetObject aufrufen oder den neuen Operator verwenden, um ein vom Server aktiviertes Objekt auf dem Client zu instanziieren.

NoteHinweis:

Möglicherweise müssen Sie den Channel nicht auf der Clientseite registrieren. Wenn der Client keinen Channel registriert, erstellt das Remotesystem automatisch einen Channel mit einem in der Datei Machine.config angegebenen Standardchannels, um ausgehende Anforderungen auszuführen. Diese automatische Channelauswahl auf dem Client registriert den Channel nicht für die Überprüfung auf Rückruffunktionen vom Server. Außerdem registriert sie keine benutzerdefinierte Channelimplementierung, es sei denn, der benutzerdefinierte Channel wird der Datei machine.config hinzugefügt. In diesem Fall müssen Sie den Typ des Channels registrieren, der in der Clientanwendungsdomäne verwendet werden soll.

Das folgende Codebeispiel zeigt einen Aufruf an Activator.GetObject. Dabei wird vorausgesetzt, dass TcpChannel für die Kommunikation auf Anschluss 8080 registriert wurde. Wenn dem Client nur bekannt ist, dass das Serverobjekt eine bestimmte Schnittstelle implementiert, müssen Sie einen Aufruf an Activator.GetObject verwenden, weil Sie nur mithilfe von new (New in Visual Basic) eine Klasseninstanz erstellen können.

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

Denken Sie daran, dass zu diesem Zeitpunkt keine tatsächliche Kommunikation mit dem Server stattgefunden hat. Folglich wurde das Remoteobjekt nicht instanziiert. Was instanziiert wurde, ist das Proxyobjekt auf der Clientseite. Der Client kann MyRemoteClass jetzt so verwenden, als ob es ein direkter Verweis auf das Remoteobjekt wäre. Die RemoteObjectClass-Instanz, die der Client zur Kommunikation von Methodenaufruf zu Methodenaufruf tatsächlich verwendet, hängt davon ab, ob das Serverobjekt als Singleton-Typ oder als SingleCallTyp deklariert ist. Unabhängig davon, ob der Herausgeber des Serverobjekts diese Informationen verfügbar macht, behandelt der Client seinen Objektverweis auf genau die gleiche Weise.

Singletons

Bei COM bedeutete "singleton", dass ein Objekt nicht aus dem Speicher gelöscht würde, solange Clients Verweise auf das Objekt besaßen. In .NET-Remoting unterliegt ein Singleton-Objekt jedoch der Lebensdauerlease, die für das Objekt angegeben wurde. Damit kann es selbst dann wiederverwendet werden, wenn Clients noch über Verweise darauf verfügen. Sie können den zuerst genannten Typ des Singleton-Objekts erstellen, indem Sie die InitializeLifetimeService-Methode von MarshalByRefObject so überschreiben, dass ein NULL-Verweis (Nothing in Visual Basic) zurückgegeben wird. Damit bleibt das Objekt im Speicher, solange die Hostanwendungsdomäne ausgeführt wird. Ausführliche Informationen finden Sie unter Lebensdauerleases. Sie können den als zweites genannten Typ eines Singleton-Objekts dadurch erstellen, dass Sie die anfängliche Leasedauer in der Remotekonfigurationsdatei konfigurieren.

Siehe auch

Referenz

WellKnownObjectMode Enumeration

Konzepte

Aktivierung von Remoteobjekten
Clientaktivierung
Lebensdauerleases

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.