Freigeben über


Erweitern von RealProxy

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.

Eine Erweiterung des Proxy kann hilfreich sein, wenn Sie sich beispielsweise an der Proxyerstellung beteiligen, Remotemethodenaufrufe marshallen oder die Objektidentität bestimmen möchten. Sie können mit der erweiterbaren RealProxy-Klasse einen eigenen Proxy erstellen. Zur Erstellung eines benutzerdefinierten Proxys müssen eine Klasse von der RealProxy-Klasse abgeleitet und die RealProxy.Invoke-Methode überschrieben werden. Die new-Anweisung (New in Visual Basic) kann abgefangen werden, indem Sie vom ProxyAttribute-Attribut ableiten und das Attribut auf ein untergeordnetes Element vonContextBoundObject anwenden. (Das Proxyattribut kann nicht für ein untergeordnetes Element von MarshalByRefObject übernommen werden.) Wenn new aufgerufen wird, erstellt das abgeleitete ProxyAttribute eine Instanz des benutzerdefinierten Proxys. Eine Anwendung kann auch direkt eine benutzerdefinierte Proxyinstanz erstellen.

Wenn der Anwendungscode eine Methode für einen benutzerdefinierten Proxy aufruft, wird die überschriebene RealProxy.Invoke-Methode mit einem Objekt aufgerufen, das IMessage implementiert. Die IMessage-Implementierung stellt eine IDictionary-Implementierung bereit, die Name-/Wert-Paare von Informationen zu dieser Methode bietet. Weitere Informationen zu bestimmten Wörterbucheinträgen finden Sie in der Referenzdokumentation zur IMessage-Schnittstelle und verwandten Schnittstellen (IMethodCallMessage und IMethodReturnMessage).

Das eigentliche Objekt kann von der überschriebenen Invoke-Methode durch einen Aufruf der RemotingServices.ExecuteMessage-Methode aufgerufen werden, die den Aufruf an das eigentliche Objekt weiterleitet.

Sie können auch die EnterpriseServicesHelper.CreateConstructionReturnMessage-Methode verwenden, um ein IConstructionCallMessage-Objekt zu verarbeiten und ein IConstructionReturnMessage-Objekt zu generieren. Zudem können Sie mit der RealProxy.InitializeServerObject-Methode das Sicherungsobjekt erstellen (das Objekt das vom Proxy repräsentiert wird).

Beim Einsatz des abgeleiteten ProxyAttribute können Sie in der überschriebenen ProxyAttribute.CreateInstance-Methode ein richtiges Objekt erstellen und als Feld im benutzerdefinierten Proxy speichern. Der benutzerdefinierte Proxy kann dieses Objekt marshallen, um das ObjRef-Objekt abzurufen, das den URI (Uniform Resource Identifier) enthält. Der URI muss im Proxy gespeichert werden, weil der Eintrag "__Uri" in der von der IMessage.Properties-Eigenschaft zurückgegebenen Sammlung in der IMessage-Implementierung so festgelegt werden muss, dass Aufrufe an ein wirkliches Objekt weitergeleitet werden.

Natürlich muss die Nachricht nicht an ein wirkliches Objekt weitergeleitet werden, sondern Sie können in der Methode Invoke eine Aktion damit durchführen und ein Objekt erzeugen und zurückgeben, das die IMethodReturnMessage)-Schnittstelle implementiert.

Um an Marshalling teilzunehmen, überschreiben Sie die RealProxy.CreateObjRef-Methode, und stellen Sie ein benutzerdefiniertes ObjRef bereit, das ObjRef erweitert. Wenn Sie benutzerdefinierte Daten dem benutzerdefinierten ObjRef hinzufügen möchten, überschreiben Sie **** ObjRef.GetObjectData. Sie fügen die benutzerdefinierten Daten hinzu und delegieren die ObjRef.GetObjectData-Methode, um die Objektidentitätsfunktionen des .NET-Remoting-Marshallingsystems zu ändern.

Während der Deserialisierung ruft das Remoting-System die überschriebene GetRealObject-Methode für das benutzerdefinierte ObjRef auf. Hier sollten Sie die grundlegende GetRealObject-Methode delegieren, weil diese Methode die Objektidentität handhabt und Remotechannels einrichtet. Die Basismethode ruft auch die überschriebene ProxyAttribute.CreateProxy-Methode auf, damit Sie den benutzerdefinierten Proxy einrichten können.

Mithilfe von ObjRef.IsFromThisAppDomain und ObjRef.IsFromThisProcess lässt sich bestimmen, wie das Marshalling rückgängig gemacht werden soll.

Beachten Sie, dass das Remotingsystem das Objekt automatisch marshallt und dessen Marshalling rückgängig macht, wenn Sie während des Marshalling kein benutzerdefiniertes ObjRef-Objekt bereitstellen. In diesem Fall wird der benutzerdefinierte Proxy in der Anwendungsdomäne der aufrufenden Routine nicht verwendet.

Siehe auch

Aufgaben

Technologiebeispiel für benutzerdefinierte Proxys

Verweis

RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage

Weitere Ressourcen

Remoting für Fortgeschrittene