Erweitern von "RealProxy"
Das Erweitern des Proxys kann nützlich sein, um die Teilnahme an Proxyerstellung, Marshalling, Objektidentität usw. zu ermöglichen. Sie können mithilfe der erweiterbaren RealProxy-Klasse einen eigenen Proxy erstellen. Um einen benutzerdefinierten Proxy zu erstellen, müssen Sie eine Klasse von der RealProxy-Klasse ableiten und die RealProxy.Invoke-Methode außer Kraft setzen. Die new-Anweisung (New in Visual Basic) kann durch Ableiten vom ProxyAttribute-Attribut und Anwenden des Attributs auf ein untergeordnetes Element von ContextBoundObject abgefangen werden. (Das Anwenden des Proxyattributs auf ein untergeordnetes Element von MarshalByRefObject wird nicht unterstützt.) Beim Aufruf von new erstellt das abgeleitete ProxyAttribute-Attribut eine Instanz des benutzerdefinierten Proxys. Darüber hinaus kann eine Anwendung auch direkt eine benutzerdefinierte Proxyinstanz erstellen.
Wenn der Anwendungscode eine Methode für einen benutzerdefinierten Proxy aufruft, wird die außer Kraft gesetzte RealProxy.Invoke-Methode mit einem Objekt aufgerufen, das IMessage implementiert. Die IMessage-Implementierung stellt eine IDictionary-Implementierung bereit, die wiederum Namen-/Wertpaare mit Informationen zur Methode bereitstellt. Weitere Informationen zu bestimmten Einträgen im Wörterbuch finden Sie in der Referenzdokumentation für die IMessage-Schnittstelle und verwandte Schnittstellen (IMethodCallMessage und IMethodReturnMessage).
Ein echtes Objekt kann von der außer Kraft gesetzten Invoke-Methode durch einen Aufruf von RemotingServices.ExecuteMessage aufgerufen werden, wodurch der Aufruf an das echte Objekt gesendet wird.
Sie können auch die EnterpriseServicesHelper.CreateConstructionReturnMessage-Methode verwenden, um eine IConstructionCallMessage-Implementierung zu verarbeiten und eine IConstructionReturnMessage-Implementierung zu generieren. Sie können das Sicherungsobjekt auch mithilfe der RealProxy.InitializeServerObject-Methode erstellen.
Bei Verwendung des abgeleiteten ProxyAttribute-Attributs können Sie ein echtes Objekt in der außer Kraft gesetzten ProxyAttribute.CreateInstance-Methode erstellen und es als Feld im benutzerdefinierten Proxy speichern. Der benutzerdefinierte Proxy kann das echte Objekt marshallen, um das ObjRef-Objekt mit dem URI (Uniform Resource Identifier) abzurufen. Der URI muss im Proxy gespeichert werden, da der "__Uri"-Eintrag in der von der IMessage.Properties-Eigenschaft zurückgegebenen Auflistung in der IMessage-Implementierung festgelegt werden muss, um einen Aufruf an ein echtes Objekt zu senden.
Natürlich muss die Nachricht nicht für ein echtes Objekt gesendet werden. Sie können damit einige Aufgaben in Invoke ausführen und ein Objekt generieren und zurückgeben, das die IMethodReturnMessage-Schnittstelle implementiert.
Für die Teilnahme am Marshalling setzen Sie RealProxy.CreateObjRef außer Kraft und stellen ein benutzerdefiniertes ObjRef-Objekt bereit, das ObjRef erweitert. Wenn Sie dem benutzerdefinierten ObjRef-Objekt benutzerdefinierte Daten hinzufügen möchten, setzen Sie GetObjectData außer Kraft. Sie fügen der ObjRef.GetObjectData-Methode benutzerdefinierte Daten und einen Delegaten hinzu, um die Objektidentitätsfunktionen des .NET Remoting-Marshallingsystems zu ändern.
Während der Deserialisierung ruft das Remotingsystem das außer Kraft gesetzte IObjectReference.GetRealObject-Objekt für das benutzerdefinierte ObjRef-Objekt auf. Hier sollten Sie an die ObjRef.GetRealObject-Basismethode delegieren, da die Basis die Objektidentität verarbeitet und Remotechannels einrichtet. Die Basis ruft auch die außer Kraft gesetzte ProxyAttribute.CreateProxy-Methode auf, damit Sie den benutzerdefinierten Proxy einrichten können.
Mit ObjRef.IsFromThisAppDomain und ObjRef.IsFromThisProcess kann bestimmt werden, wie das Unmarshalling ausgeführt werden soll.
Beachten Sie Folgendes: Wenn Sie während des Marshallings kein benutzerdefiniertes ObjRef-Objekt bereitstellen, marshallt und unmarshallt das Remotingsystem das Objekt automatisch, und der benutzerdefinierte Proxy wird in der Anwendungsdomäne des Aufrufers nicht verwendet.
Siehe auch
Referenz
RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage