扩展代理可帮助您参与代理创建过程、封送远程方法调用、确定对象标识或执行其他一些操作。通过使用可扩展的 RealProxy 类,可以生成您自己的代理。若要生成自定义代理,需要从 RealProxy 类中派生类,并重写 RealProxy.Invoke 方法。通过从 ProxyAttribute 属性进行派生并将该属性应用于 ContextBoundObject 的子级,可以截获 new(在 Visual Basic 中为 New)语句。(不支持对 MarshalByRefObject 的子级应用代理属性。)调用 new 时,派生的 ProxyAttribute 将创建自定义代理的实例。应用程序也可以直接创建自定义代理实例。
当应用程序代码对自定义代理调用方法时,将用实现 IMessage 的对象调用被重写的 RealProxy.Invoke 方法。IMessage 实现提供 IDictionary 实现,后者提供有关该方法的名称/值对信息。有关字典中特定条目的更多信息,请参见 IMessage 接口及相关接口(IMethodCallMessage 和 IMethodReturnMessage)的参考文档。
通过调用 RemotingServices.ExecuteMessage 可以从被重写的 Invoke 方法中调用真实对象,RemotingServices.ExecuteMessage 负责将该调用调度至真实对象。
您也可以使用 EnterpriseServicesHelper.CreateConstructionReturnMessage 方法来处理 IConstructionCallMessage 对象并生成 IConstructionReturnMessage 对象。此外,还可以使用 RealProxy.InitializeServerObject 方法创建后备对象(由代理表示的对象)。
使用派生的 ProxyAttribute 时,可以在被重写的 ProxyAttribute.CreateInstance 方法中创建真实对象并将其作为字段存储在自定义代理中。自定义代理可以封送该真实对象,以获取包含统一资源标识符 (URI) 的 ObjRef 对象。URI 必须存储在代理中,因为必须在 IMessage 实现中设置由 IMessage.Properties 属性返回的集合中的“__Uri”条目,才能将调用调度至真实对象。
当然,真实对象上不需要调度该消息;您可以在 Invoke 中用它执行某项任务,然后生成并返回实现 IMethodReturnMessage 接口的对象。
若要参与封送处理,请重写 RealProxy.CreateObjRef 并提供扩展 ObjRef 的自定义 ObjRef。如果要向自定义 ObjRef 添加自定义数据,请重写 ObjRef.GetObjectData。通过向 ObjRef.GetObjectData 方法添加自定义数据和委托,可以修改 .NET 远程处理封送处理系统的对象标识功能。
在反序列化过程中,远程处理系统将对自定义 ObjRef 调用被重写的 GetRealObject。在此过程中,应委托 GetRealObject 基方法,因为该基方法会处理对象标识并设置远程处理信道。此外,该基方法还会调用被重写的 ProxyAttribute.CreateProxy 方法,以允许您设置自定义代理。
ObjRef.IsFromThisAppDomain 和 ObjRef.IsFromThisProcess 可用于确定要如何取消封送。
请注意,如果在封送处理期间未提供自定义 ObjRef,远程处理系统将自动封送和取消封送对象,并且调用方的应用程序域中并不使用自定义代理。
请参见
参考
RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage
其他资源
高级远程处理
Custom Proxies Technology Sample
版权所有 (C) 2007 Microsoft Corporation。保留所有权利。