通道
本主題專門說明一項為了在現有應用程式中提供回溯相容性而保留的舊有技術,不建議用於新的開發工作。分散式應用程式應使用 Windows Communication Foundation (WCF) 進行開發。
通道是在跨遠端界限的應用程式之間 (不論是應用程式定義域、處理序或電腦之間) 傳輸訊息的物件。通道可以在傳入訊息的端點上接聽、傳送傳出訊息至另一個端點,或兩者皆可。這讓您能夠外掛範圍廣泛的通訊協定,即使在通道的另一端沒有 Common Language Runtime 也沒關係。
通道必須實作 IChannel 介面以便提供諸如 ChannelName 和 ChannelPriority 的資訊屬性。針對特定連接埠之特定通訊協定接聽需要而設計的通道會實作 IChannelReceiver,而針對資訊傳遞需要而設計的通道則會實作 IChannelSender。TcpChannel 與 HttpChannel 物件兩者同時會實作這兩種介面,方便用來傳遞或接收資訊。
您可以透過下列方式,使用遠端基礎結構來註冊通道:
如果您要發行可遠端處理的物件,則在註冊伺服器物件之前,先呼叫 ChannelServices.RegisterChannel。
如果您要取用可遠端處理物件的功能,則在建立伺服器物件的執行個體時,先呼叫 RegisterChannel。
您也可以從遠端組態檔載入通道。如需詳細資訊,請參閱組態。
在用戶端上,當訊息通過用戶端內容鏈結後,會傳遞至用戶端通道接收鏈結。第一個通道接收通常是格式器接收,它會將訊息序列化為資料流,然後經由通道接收鏈結向下傳遞到用戶端傳輸接收。然後用戶端傳輸接收會將這個資料流寫出至網路。
在伺服器端,伺服器傳輸接收會從網路讀取要求,並且將要求資料流傳遞到伺服器通道接收鏈結。在這個鏈結結尾的伺服器格式器接收會將要求還原序列化為訊息。它會接著將此訊息傳遞至遠端基礎結構。如需通道接收的詳細資訊,請參閱接收與接收鏈結。
通道規則
當用戶端呼叫遠端物件上的方法時,與呼叫相關的參數與其他詳細資料會透過通道傳輸至遠端物件。任何來自呼叫的結果都會以相同方式傳回。用戶端可以選取在伺服器上註冊的任何通道以便與遠端物件通訊,這樣一來開發人員就可以自由選取最適合自身需求的通道。您也可以自訂任何現有的通道,或是建置使用不同通訊協定的新通道。通道選擇受制於下列規則:
在呼叫遠端物件之前,伺服器上的遠端系統至少必須註冊一個通道。在註冊物件之前,必須先註冊通道。如果用戶端尚未註冊通道,則遠端系統會選擇或建立一個通道以便傳遞傳出呼叫。
注意: 如果用戶端預期得到回呼函式,則用戶端上必須註冊接聽通道,而且必須註冊伺服器以使用相容的通道。 每個應用程式定義域都應該註冊一個通道。單一處理序可包含多個應用程式定義域。當處理序結束時,所有由該處理序註冊的通道都會自動終結。
通道名稱必須是應用程式定義域中唯一的。例如,由於預設通道已具有名稱,若要將兩個 HttpChannel 物件註冊到某個應用程式定義域中時,您必須先變更通道名稱才能加以註冊。下列 C# 程式碼範例示範這項功能。
IDictionary prop = new Hashtable(); prop["name"] = "http1"; prop["port"] = "9001"; ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
您無法註冊重複接聽特定連接埠的通道。就算每個應用程式定義域上都已註冊通道,相同電腦上的不同應用程式定義域還是無法註冊接聽相同連接埠的相同通道。
如果您不確定某個連接埠是否可用,請在設定通道連接埠時使用 0 (零),讓遠端系統為您選擇可用的連接埠。
用戶端可以使用任何已註冊的通道來與遠端物件通訊。遠端系統可確保在用戶端嘗試連接至物件時,遠端物件已經連接至正確的通道。用戶端在嘗試與遠端物件通訊時,必須負責呼叫 ChannelServices.RegisterChannel。如果用戶端預期得到回呼函式,則它必須註冊通道與連接埠。
當用戶端呼叫 Proxy 上的方法時,呼叫會被攔截並一起放入訊息中,然後傳遞給 RealProxy 類別的執行個體。RealProxy 類別會將訊息轉送至訊息接收以便處理。訊息接收會建立與遠端物件所註冊的通道的連線,並將訊息透過通道分派至來源應用程式定義域。因此,訊息會經過解封送處理,並在遠端物件本身進行呼叫。
當遠端處理初始化用戶端網域內遠端物件的 Proxy 時,有能力與遠端物件通訊的訊息會藉由呼叫選取通道上的 IChannelSender.CreateMessageSink 從用戶端所設定的通道中擷取回來。
遠端物件與通道之間的關係,是遠端系統最讓人混淆的地方。例如,假如物件只在呼叫抵達時才啟動,那麼 WellKnownObjectMode.SingleCall 遠端物件該如何接聽以便讓用戶端順利連接就是一個問題。
這種情況的可能原因有部分是因為遠端物件會共用通道;遠端物件並不擁有通道。裝載遠端物件的伺服器應用程式必須透過遠端系統來註冊所需的通道以及所公開的物件。一旦通道註冊好了,通道就能自動開始接聽指定連接埠上的用戶端要求。在同步呼叫的情況下,來自用戶端的連線在訊息呼叫的期間會一直保持連線狀態。由於每個用戶端連線都是透過自己的執行緒來加以處理,因此單一通道可以同時處理多個用戶端要求。