当要参与代理创建过程、封送处理或对象标识及其他活动时,扩展代理会很有用。可以使用可扩展的 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