扩展 RealProxy

本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用  Windows Communication Foundation (WCF) 来开发分布式应用程序。

扩展代理可帮助您参与代理创建过程、封送远程方法调用、确定对象标识或执行其他一些操作。通过使用可扩展的 RealProxy 类,可以生成您自己的代理。若要生成自定义代理,需要从 RealProxy 类中派生类,并重写 RealProxy.Invoke 方法。通过从 ProxyAttribute 特性进行派生并将该特性应用于 ContextBoundObject 的子级,可以截获 new(在 Visual Basic 中为 New)语句。(不支持对 MarshalByRefObject 的子级应用代理特性。)调用 new 时,派生的 ProxyAttribute 将创建自定义代理的实例。应用程序也可以直接创建自定义代理实例。

当应用程序代码对自定义代理调用方法时,将用实现 IMessage 的对象调用被重写的 RealProxy.Invoke 方法。IMessage 实现提供 IDictionary 实现,后者提供有关该方法的名称/值对信息。有关字典中特定条目的更多信息,请参见 IMessage 接口及相关接口(IMethodCallMessageIMethodReturnMessage)的参考文档。

通过调用 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.IsFromThisAppDomainObjRef.IsFromThisProcess 可用于确定要如何取消封送。

请注意,如果在封送处理期间未提供自定义 ObjRef,远程处理系统将自动封送和取消封送对象,并且调用方的应用程序域中并不使用自定义代理。

另请参见

任务

自定义代理技术示例

参考

RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage

其他资源

高级远程处理