擴充 RealProxy
本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。
當您想要特別參與 Proxy 建立處理序、封送處理遠端方法呼叫,或是判斷物件識別時,延伸 Proxy 就會很有用。您可以使用可延伸的 RealProxy 類別來建置自己的 Proxy。若要建置自訂 Proxy,需要從 RealProxy 類別衍生類別並覆寫 RealProxy.Invoke 方法。new (在 Visual Basic 中為 New ) 陳述式可以藉由從 ProxyAttribute 屬性衍生來加以攔截,並將屬性套用至 ContextBoundObject 的子項(不支援將 Proxy 屬性套用至 MarshalByRefObject 子項)。一旦呼叫了 new,衍生的 ProxyAttribute 會建立自訂 Proxy 的執行個體。應用程式也可以直接建立自訂 Proxy 執行個體。
當應用程式程式碼呼叫自訂 Proxy 上的方法時,會使用可實作 IMessage 的物件來呼叫覆寫的 RealProxy.Invoke 方法。IMessage 實作會提供 IDictionary 實作,進一步提供關於方法資訊的名稱/值對。如需字典中特定項目的詳細資訊,請參閱 IMessage 介面與相關介面 (IMethodCallMessage 和 IMethodReturnMessage) 的參考文件。
您可以呼叫 RemotingServices.ExecuteMessage,將呼叫分派至真實物件,以呼叫來自覆寫之 Invoke 方法的真實物件。
您也可以使用 EnterpriseServicesHelper.CreateConstructionReturnMessage 方法來處理 IConstructionCallMessage 物件,並產生 IConstructionReturnMessage 物件。您也可以使用 RealProxy.InitializeServerObject 方法來建立支援的物件 (Proxy 所代表的物件)。
在使用衍生的 ProxyAttribute 時,您可以使用覆寫的 ProxyAttribute.CreateInstance 方法來建立真實物件,並將其當成欄位儲存在自訂 Proxy 中。自訂 Proxy 可以封送處理真實物件,以取得包含統一資源識別元 (URI) 的 ObjRef 物件。URI 必須存放在 Proxy 中,因為內含在 IMessage.Properties 屬性所傳回的集合中的 "__Uri" 項目必須於 IMessage 實作中設定完成,才能將呼叫分派至真實物件。
當然,訊息不用真的分派到真實物件上;您可以透過 Invoke 方法來執行與此訊息相關的一些工作,接著產生並傳回可實作 IMethodReturnMessage 介面的物件。
若要參與封送處理,請覆寫 RealProxy.CreateObjRef 並提供可延伸 ObjRef 的自訂 ObjRef 。如果您想要將自訂資料加入自訂 ObjRef,請覆寫 ObjRef.GetObjectData。您可以加入自訂資料並將其委派給 ObjRef.GetObjectData 方法,以修改 .NET 遠端封送處理系統的物件識別能力。
在還原序列化期間,遠端系統會呼叫覆寫的 GetRealObject (位於自訂的 ObjRef 上)。在這裡,您可以委派給基底 GetRealObject 方法,因為基底會負責處理物件識別並設定遠端通道。基底同時會呼叫覆寫的 ProxyAttribute.CreateProxy 方法,以供您設定自訂的 Proxy。
您可以使用 ObjRef.IsFromThisAppDomain 和 ObjRef.IsFromThisProcess 來決定解封送處理的方式。
請注意,如果您沒有在封送處理期間提供自訂 ObjRef,遠端系統會自動封送處理與解封送處理物件,而且不會在呼叫端的應用程式定義域中使用自訂 Proxy。
另請參閱
工作
參考
RealProxy
ProxyAttribute
RemotingServices
IMessage
IMethodReturnMessage
IMethodCallMessage