當您希望參與 Proxy 建立處理序、封送處理或物件識別等事情時,擴充 Proxy 可以是很有用的。您可以使用可擴充的 RealProxy 類別建置您自己的 Proxy。要建置自訂 Proxy,牽涉到從 RealProxy 類別衍生類別以及覆寫 RealProxy.Invoke 方法。藉由衍生自 ProxyAttribute 屬性和將屬性套用至 ContextBoundObject 的子系上,可攔截 new (Visual Basic 中的 New) 陳述式(不支援將 Proxy 屬性套用至 MarshalByRefObject 的子系上)。當呼叫 new 時,衍生的 ProxyAttribute 建立自訂 Proxy 的執行個體。應用程式也可以直接建立自訂 Proxy 執行個體。
當應用程式程式碼呼叫自訂 Proxy 上的方法時,會以實作 IMessage 的物件呼叫覆寫的 RealProxy.Invoke 方法。IMessage 實作提供 IDictionary 實作,而後者會提供有關方法的名稱/值配對資訊。如需字典中特定項目的詳細資訊,請參閱 IMessage 介面和相關介面 (IMethodCallMessage 和 IMethodReturnMessage) 的參考文件。
您可從覆寫的 Invoke 方法呼叫實際物件,方法是呼叫 RemotingServices.ExecuteMessage,這個項目會分派對實際物件的呼叫。
您也可以利用 EnterpriseServicesHelper.CreateConstructionReturnMessage 方法來處理 IConstructionCallMessage 實作並產生 IConstructionReturnMessage 實作。您也可以使用 RealProxy.InitializeServerObject 方法建立支援物件。
在使用衍生的 ProxyAttribute 時,您可以在覆寫的 ProxyAttribute.CreateInstance 方法中建立實際物件,並將它儲存為自訂 Proxy 中的欄位。自訂 Proxy 可封送處理實際物件,以獲得包含 Uniform Resource Identifier (URI) 的 ObjRef 物件。URI 必須儲存在 Proxy 中,因為集合中 IMessage.Properties 屬性所傳回的**「__Uri」**項目,必須在 IMessage 實作中設定,才能分派對實際物件的呼叫。
當然,訊息不一定要在實際物件上分派;您也可以在 Invoke 中利用它執行某些工作,並產生和傳回實作IMethodReturnMessage 介面的物件。
若要參與封送處理,應覆寫 RealProxy.CreateObjRef 並提供可擴充 ObjRef 的自訂 ObjRef。如果您希望將自訂資料加入自訂 ObjRef 中,應覆寫 GetObjectData。您將自訂資料和委派加入 ObjRef.GetObjectData 方法,以修改 .NET 遠端處理封送處理系統的物件識別功能。
在還原序列化期間,遠端處理系統將呼叫自訂 ObjRef 上的覆寫 IObjectReference.GetRealObject 。這時,您應該委派給基底 ObjRef.GetRealObject 方法,因為這個基底將處理物件識別並設定遠端處理通道。這個基底也將呼叫您的覆寫 ProxyAttribute.CreateProxy 方法,允許您設定自己的自訂 Proxy。
ObjRef.IsFromThisAppDomain 和 ObjRef.IsFromThisProcess 可用來決定您希望解封送處理的方式。
應注意,如果在封送處理期間您不提供自訂的 ObjRef,遠端處理系統將自動封送處理和解封送處理物件,並且自訂 Proxy 將不會在呼叫端的應用程式定義域中使用。
請參閱
進階遠端處理 | RealProxy | ProxyAttribute | RemotingServices | IMessage | IMethodReturnMessage | IMethodCallMessage