擴充 RealProxy
如果您想要參與 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)。
呼叫 RemotingServices.ExecuteMessage (它會將呼叫分派給實際物件),即可從覆寫的 Invoke 方法呼叫實際物件。
您也可使用 EnterpriseServicesHelper.CreateConstructionReturnMessage 方法處理 IConstructionCallMessage 實作,並產生 IConstructionReturnMessage 實作。您還可使用 RealProxy.InitializeServerObject 方法建立支援物件。
使用衍生的 ProxyAttribute 時,可在覆寫的 ProxyAttribute.CreateInstance 方法上建立實際物件,並將它儲存為自訂 Proxy 中的欄位。自訂 Proxy 可封送處理實際物件,以取得包含統一資源識別元 (URI) 的 ObjRef 物件。因為在 IMessage 實作中,必須設定由 IMessage.Properties 屬性傳回之集合中的 "__Uri" 項目才能將呼叫分派給實際物件,所以 Proxy 中必須儲存 URI。
當然,訊息不一定要分派到實際物件上;您可以在 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