扩展 RealProxy
当要参与代理创建过程、封送处理或对象标识及其他活动时,扩展代理会很有用。可以使用可扩展的 RealProxy 类来生成您自己的代理。生成自定义代理涉及从 RealProxy 类派生类以及重写 RealProxy.Invoke 方法。通过从 ProxyAttribute 属性派生并将该属性应用于 ContextBoundObject 的子级,可以截获 new(在 Visual Basic 中为 New)语句。(不支持将代理属性应用于 MarshalByRefObject 的子级。)当调用 new 时,派生的 ProxyAttribute 将创建自定义代理的一个实例。应用程序还可以直接创建自定义代理实例。
应用程序代码在自定义代理上调用方法时,将用实现 IMessage 的对象调用重写的 RealProxy.Invoke 方法。IMessage 实现提供了一个 IDictionary 实现,后者提供有关此方法的信息的名称/值对。有关字典中的特定项的详细信息,请参见 IMessage 接口和相关接口(IMethodCallMessage 及 IMethodReturnMessage)的参考文档。
通过调用 RemotingServices.ExecuteMessage(它将调用调度到真实对象上),可以从重写的 Invoke 方法中调用真实对象。
您也可以使用 EnterpriseServicesHelper.CreateConstructionReturnMessage 方法处理 IConstructionCallMessage 实现并生成 IConstructionReturnMessage 实现。您还可以使用 RealProxy.InitializeServerObject 方法创建后备对象。
使用派生的 ProxyAttribute 时,可以在重写的 ProxyAttribute.CreateInstance 方法中创建一个真实对象,并将它作为字段存储在自定义代理中。自定义代理可以封送真实对象以获取包含统一资源标识符 (URI) 的 ObjRef 对象。由于 IMessage.Properties 属性返回的集合中的“__Uri”项必须在 IMessage 实现中设置才能将调用调度到真实对象上,因此必须将 URI 存储在代理中。
当然,消息不必非得调度到真实对象上;您可以在 Invoke 中用它来执行某一任务,然后生成并返回一个实现 IMethodReturnMessage 接口的对象。
要参与封送处理,请重写 RealProxy.CreateObjRef 并提供一个扩展 ObjRef 的自定义 ObjRef。如果要将自定义数据添加到自定义 ObjRef,请重写 GetObjectData。将自定义数据和委托添加到 ObjRef.GetObjectData 方法以修改 .NET 远程处理封送处理系统的对象标识功能。
在反序列化期间,远程处理系统将在自定义 ObjRef 上调用重写的 IObjectReference.GetRealObject。在此处,您应当委托给基 ObjRef.GetRealObject 方法,这是因为该基将处理对象标识并设置远程处理信道。该基还将调用重写的 ProxyAttribute.CreateProxy 方法以使您可以设置自定义代理。
ObjRef.IsFromThisAppDomain 和 ObjRef.IsFromThisProcess 可用于确定取消封送的方式。
请注意,如果您没有在封送处理期间提供自定义 ObjRef,远程处理系统将自动封送和取消封送对象,而且自定义代理将不会在调用方的应用程序域中使用。
请参见
参考
RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage