Partager via


Extension de RealProxy

L'extension du proxy peut être utile lorsque vous voulez participer au processus de création du proxy, du marshaling ou une identité d'objet, entre autres. Vous pouvez générer votre propre proxy à l'aide de la classe extensible RealProxy. Générer un proxy personnalisé implique la dérivation d'une classe à partir de la classe RealProxy et la substitution de la méthode RealProxy.Invoke. L'instruction new (New dans Visual Basic) peut être interceptée en dérivant de l'attribut ProxyAttribute et en appliquant l'attribut à un enfant de ContextBoundObject. (L'application de l'attribut proxy à un enfant de MarshalByRefObject n'est pas prise en charge.) Lorsque new est appelé, le ProxyAttribute dérivé crée une instance du proxy personnalisé. Une application peut également créer directement une instance de proxy personnalisée.

Lorsque le code de l'application appelle une méthode sur un proxy personnalisé, la méthode RealProxy.Invoke substituée est appelée avec un objet qui implémente IMessage. L'implémentation IMessage fournit une implémentation IDictionary qui fournit des paires nom/valeur d'informations sur la méthode. Pour obtenir plus d'informations sur des entrées particulières dans le dictionnaire, consultez la documentation de référence de l'interface IMessage et des interfaces associées (IMethodCallMessage et IMethodReturnMessage).

Un objet réel peut être appelé à partir de la méthode Invoke substituée en appelant RemotingServices.ExecuteMessage, qui distribue l'appel à l'objet réel.

Vous pouvez également utiliser la méthode EnterpriseServicesHelper.CreateConstructionReturnMessage pour traiter une implémentation IConstructionCallMessage et générer une implémentation IConstructionReturnMessage. Vous pouvez également utiliser la méthode RealProxy.InitializeServerObject pour créer l'objet de sauvegarde.

Lorsque vous utilisez le ProxyAttribute dérivé, vous pouvez créer un objet réel dans la méthode ProxyAttribute.CreateInstance substituée et le stocker comme champ dans le proxy personnalisé. Le proxy personnalisé peut marshaler l'objet réel pour obtenir l'objet ObjRef qui contient l'URI (Uniform Resource Identifier). L'URI doit être stocké dans le proxy, car l'entrée « __Uri » de la collection retournée par la propriété IMessage.Properties doit être définie dans l'implémentation IMessage afin de distribuer un appel à un objet réel.

Évidemment, il n'est pas nécessaire que le message soit distribué sur un objet réel ; vous pouvez effectuer certaines tâches à l'aide de cet objet dans Invoke et générer puis retourner un objet qui implémente l'interface IMethodReturnMessage.

Pour participer au marshaling, substituez RealProxy.CreateObjRef et fournissez un ObjRef personnalisé qui étend ObjRef. Si vous voulez ajouter des données personnalisées au ObjRef personnalisé, substituez GetObjectData. Vous ajoutez vos données et délégués personnalisés à la méthode ObjRef.GetObjectData pour modifier les possibilités d'identité de l'objet du système de marshaling de .NET Remoting.

Lors de la désérialisation, le système d'accès distant appelle votre IObjectReference.GetRealObject substitué sur l'objet personnalisé ObjRef. Dans ce cas, vous devez déléguer à la méthode ObjRef.GetRealObject de base, car la base gérera l'identité de l'objet et définira les canaux d'accès distant. La base appellera également votre méthode ProxyAttribute.CreateProxy substituée pour vous permettre de définir votre proxy personnalisé.

ObjRef.IsFromThisAppDomain et ObjRef.IsFromThisProcess peuvent être utilisés pour déterminer la manière dont vous voulez démarshaler.

Remarquez que si vous ne fournissez pas un objet ObjRef personnalisé lors du marshaling, le système d'accès distant marshalera et démarshalera automatiquement l'objet et le proxy personnalisé ne sera pas utilisé dans le domaine d'application de l'appelant.

Voir aussi

Accès distant avancé | RealProxy | ProxyAttribute | RemotingServices | IMessage | IMethodReturnMessage | IMethodCallMessage