共用方式為


伺服器啟動過程

本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。

伺服器啟動物件指的是由伺服器直接控制其存留期的物件。只有當用戶端對物件執行方法呼叫,而不是當用戶端呼叫 new (如為 Visual Basic,則為 New()) 或 Activator.GetObject 時,伺服器應用程式定義域才會建立這些物件;利用此方式來節省網路來回通訊只是為了達到建立執行個體的目的。當用戶端要求伺服器啟動型別的執行個體時,用戶端應用程式定義域中只會建立 Proxy。也就是說,伺服器啟動型別只允許使用預設的建構函式。若要發行使用包含引數的特定建構函式來建立執行個體的所屬型別,您可以使用用戶端啟動過程或是動態發行您的特定執行個體。

伺服器啟動過程模式

伺服器啟動物件有兩種啟動過程模式 (或 WellKnownObjectMode 值):SingletonSingleCall

Singleton 型別不管任何時候都只有一個執行個體。如果已經存在一個執行個體,所有用戶端要求將由該執行個體來負責服務。如果不存在執行個體,則伺服器會建立一個執行個體,並由該執行個體負責服務所有後續的用戶端要求。由於 Singleton 型別具有相關聯的預設存留期,用戶端不一定會接收可遠端處理類別的相同執行個體參考,即使任何時間存在的執行個體都不超過一個也是一樣。

SingleCall 型別一律為每個用戶端要求配置一個執行個體。下一個方法叫用將由不同的伺服器執行個體負責服務,即使上一個執行個體尚未被系統回收也是一樣。SingleCall 型別不會參與存留期租用期系統。

若要建立伺服器啟動型別的執行個體,用戶端必須以程式設計方式設定自己的應用程式或是使用組態檔。在以程式設計方式設定應用程式時,可以使用 Activator.GetObject 方法在用戶端上產生伺服器啟動物件。在使用組態檔來設定應用程式時,您可以呼叫 Activator.GetObject 或是使用新的運算子在用戶端上產生伺服器啟動物件。

y0h540a7.note(zh-tw,VS.100).gif注意:
您也許不用在用戶端上註冊通道。如果用戶端沒有註冊通道,則遠端系統會自動使用 Machine.config 檔案中所指定的預設通道之一來建立通道,以執行傳出的要求。在用戶端上自動選擇通道的作法並不會註冊通道來接聽來自伺服器的任何回呼函式,而且除非該自訂通道已加入 machine.config 檔案,它也不會註冊任何自訂的通道實作。在這些情況下,您必須在用戶端應用程式定義域中註冊想要使用的通道型別。

下列程式碼範例會顯示 Activator.GetObject 的呼叫 (假設 TcpChannel 已註冊,可於連接埠 8080 上進行通訊)。如果您的用戶端只知道伺服器物件實作了特定介面,您必須使用對 Activator.GetObject 的呼叫,因為您只能使用 new (如果是 Visual Basic,則為 New ) 來建立類別的執行個體。

Dim MyRemoteClass As RemoteObjectClass = _
   CType( _
      Activator.GetObject(GetType(RemoteObjectClass), _
         "tcp://computername:8080/RemoteObjectUri" ), _
      RemoteObjectClass
   ) 
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
   typeof(RemoteObjectClass),
   "tcp://computername:8080/RemoteObjectUri "
);

請記得此時伺服器上不會發生任何實際的通訊,因此也不會產生遠端物件。用戶端上則是已經產生了 Proxy 物件。用戶端現在可以使用 MyRemoteClass,如同遠端物件的直接參考一樣。在方法呼叫之中用戶端實際用來進行通訊的 RemoteObjectClass 執行個體,端賴伺服器物件是否已宣告為 SingletonSingleCall 型別而定。不管伺服器物件的發行者是否已經公開此資訊,用戶端對所擁有的物件參考仍舊會一視同仁。

單一個體

在 COM 中,「單一個體」的意思是只要用戶端有物件的參考,物件就不會從記憶體中刪除。然而,在 .NET 遠端處理中,Singleton 物件卻受制於所指定的存留期租用期,因此即使用戶端目前保留對它的參考,仍舊可加以回收。您可以覆寫 MarshalByRefObjectInitializeLifetimeService 方法來傳回 Null 參考 (如果是 Visual Basic,則為 Nothing),以建立 Singleton 物件的先前型別。只要主機應用程式定義域持續執行,這麼做可以有效地將物件保留在記憶體中。如需詳細資訊,請參閱存留期使用期。您可以在遠端組態物件中設定初始租用時間來建立 Singleton 物件的後續型別。

另請參閱

參考

WellKnownObjectMode Enumeration

概念

遠端物件的啟動過程
用戶端啟動過程
存留期租用期