伺服器啟動
伺服器啟動的物件,其存留期直接由伺服器控制。只有當用戶端在物件上進行方法呼叫時,伺服器應用程式定義域才會建立這些物件,而不是在用戶端呼叫 new (在 Visual Basic 中為 New()) 或 Activator.GetObject 時就建立;這可省去一趟純為建立執行個體而產生的網路往返。當用戶端要求伺服器啟動型別的執行個體時,只會在用戶端應用程式定義域中建立 Proxy。不過,這也表示使用預設實作時,伺服器啟動的型別只能有預設建構函式。若要發行使用特定建構函式 (取用引數) 建立其執行個體的型別,則可使用用戶端啟動或可動態發行特定的執行個體。
伺服器啟動模式
伺服器啟動的物件有兩種啟動模式 (或 WellKnownObjectMode 值):Singleton 和 SingleCall。
Singleton 型別任何時間都不會有一個以上的執行個體。如果有執行個體,則必須由該執行個體服務所有用戶端要求。如果執行個體不存在,則伺服器會建立執行個體,由該執行個體服務所有後續的用戶端要求。因為 Singleton 型別具有相關的預設存留期,所以即使在任何時間絕不會有一個以上的執行個體,用戶端也不一定會收到可遠端處理類別之同一介面的參考。
SingleCall 型別的每個用戶端要求一律會有一個執行個體。即使系統尚未回收之前的執行個體,下個方法叫用仍會由不同的伺服器執行個體服務。SingleCall 型別不參會與存留使用期系統。
若要建立伺服器啟動之型別的執行個體,用戶端可用程式設計方式設定它們應用程式 (或使用組態檔) 並呼叫 new,或在呼叫 Activator.GetObject 時傳遞遠端物件的組態。
![]() |
---|
您可能不需在用戶端上註冊通道。如果用戶端未註冊通道,則遠端處理系統會自動使用 Machine.config 檔案中所指定的其中一個預設通道來選擇或建立通道,以進行輸出要求。用戶端上的這個自動通道選取動作不會註冊該通道以接聽來自伺服器的任何 callback 函式,且除非將自訂通道加入至 machine.config 檔案中,否則也不會註冊任何自訂通道實作。在這些情況下,您必須在用戶端應用程式定義域中註冊想要使用的通道型別。 |
下列程式碼範例顯示 Activator.GetObject 的呼叫,其中假設已註冊 TcpChannel 在連接埠 8080 上進行通訊。如果用戶端只知道伺服器物件會實作特定介面,則因為您只能使用 new (在 Visual Basic 中為 New) 建立類別的執行個體,所以必須使用 Activator.GetObject 的呼叫。
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
。用戶端實際用來在不同方法呼叫間進行通訊的執行個體,視是否將伺服器物件宣告為 Singleton 或 SingleCall 型別而定。不論伺服器物件的發行者是否公開此資訊,用戶端都會處理與其現有物件參考完全相同的物件參考。
Singleton
在 COM 中,"Singleton 表示只要用戶端具有您物件的參考,就不會從記憶體中刪除該物件。不過,在 .NET 遠端處理中,Singleton 物件是受為它所指定的存留使用期所控制,因此即使用戶端目前保存它的參考,也可收回它。覆寫 MarshalByRefObject 的 InitializeLifetimeService 方法以傳回 Null 參考 (在 Visual Basic 中為 Nothing),即可建立 Singleton 物件的前一個型別。事實上,只要主應用程式定義域正在執行,這都會將物件保留在記憶體中。如需詳細資訊,請參閱存留使用期。在遠端處理組態檔中設定初始使用期,即可建立 Singleton 物件的後一個型別。
請參閱
參考
WellKnownObjectMode 列舉型別
Marshal