Compartir a través de


Extender RealProxy

Extender el proxy puede resultarle útil cuando desee participar en el proceso de creación del proxy, en el cálculo de referencias o en la identidad del objeto, entre otros procesos. Puede crear su propio proxy mediante la clase extensible RealProxy. Para crear un proxy personalizado hay que derivar una clase de la clase RealProxy y reemplazar el método RealProxy.Invoke. La instrucción new (New en Visual Basic) se puede interceptar si se deriva del atributo ProxyAttribute y se aplica el atributo a un objeto secundario de ContextBoundObject. (No se puede aplicar el atributo de proxy a un objeto secundario de MarshalByRefObject.) Cuando se llama a new, el atributo ProxyAttribute derivado crea una instancia del proxy personalizado. Una aplicación también puede crear directamente una instancia del proxy personalizado.

Cuando el código de la aplicación llama a un método en un proxy personalizado, se llama al método RealProxy.Invoke reemplazado con un objeto que implementa IMessage. La implementación IMessage proporciona una implementación IDictionary que a su vez proporciona pares de nombre y valor de información sobre el método. Para obtener más información acerca de entradas concretas del diccionario, consulte la documentación de referencia de la interfaz IMessage y de las interfaces relacionadas (IMethodCallMessage e IMethodReturnMessage).

Para llamar a un objeto real desde el método Invoke reemplazado, se ha de llamar a RemotingServices.ExecuteMessage, que realiza la llamada al objeto real.

También se puede usar el método EnterpriseServicesHelper.CreateConstructionReturnMessage para procesar una implementación IConstructionCallMessage y generar una implementación IConstructionReturnMessage. Se puede usar asimismo el método RealProxy.InitializeServerObject para crear el objeto de respaldo.

Al usar el ProxyAttribute derivado, puede crear un objeto real en el método ProxyAttribute.CreateInstance reemplazado y almacenarlo como campo en el proxy personalizado. El proxy personalizado puede calcular las referencias del objeto real para obtener el objeto ObjRef que contiene el identificador uniforme de recursos (URI). El identificador URI debe estar almacenado en el proxy porque la entrada "__Uri" en la colección que devuelve la propiedad IMessage.Properties debe estar configurada en la implementación IMessage para poder realizar una llamada a un objeto real.

Naturalmente, no es necesario enviar el mensaje en un objeto real. Es posible realizar algunas tareas en él en el método Invoke, generar y devolver un objeto que implementa la interfaz IMethodReturnMessage.

Para participar en el cálculo de referencias, reemplace RealProxy.CreateObjRef y proporcione un objeto ObjRef personalizado que extienda ObjRef. Si desea agregar datos personalizados a la ObjRef personalizada, reemplace GetObjectData. Al agregar sus datos personalizados y delegar en el método ObjRef.GetObjectData, modifica las funciones de identidad de objetos del sistema de cálculo de referencias de .NET remoting.

Durante la deserialización, el sistema de interacción remota llamará a IObjectReference.GetRealObject que se ha reemplazado en el objeto ObjRef personalizado. En este momento, debe delegar en el método ObjRef.GetRealObject de base porque la base controlará la identidad del objeto y configurará los canales de interacción remota. La base también llamará al método ProxyAttribute.CreateProxy reemplazado para permitirle configurar su proxy personalizado.

ObjRef.IsFromThisAppDomain y ObjRef.IsFromThisProcess pueden utilizarse para determinar cómo se desea resolver las referencias.

Hay que tener en cuenta que si no proporciona una ObjRef personalizada durante el cálculo de referencias, el sistema de interacción remota calculará y resolverá automáticamente las referencias al objeto, y no se utilizará el proxy personalizado en el dominio de aplicación del llamador.

Vea también

Interacción remota avanzada | RealProxy | ProxyAttribute | RemotingServices | IMessage | IMethodReturnMessage | IMethodCallMessage