通道
通道是在跨遠端處理界限之應用程式間傳輸訊息的物件,所謂的界限可以是應用程式定義域、處理序或電腦。通道可在一個端點接聽傳入訊息,或 (及) 將傳出訊息傳送給另一個端點。透過這種方式,即使通道的另一端沒有 Common Language Runtime,您仍可以插入各式各樣的通訊協定。
通道必須實作 IChannel 介面,此介面提供像是 ChannelName 和 ChannelPriority 的資訊屬性。為在特定連接埠上接聽特定通訊協定而設計的通道,會實作 IChannelReceiver,而為傳送資訊而設計的通道,則會實作 IChannelSender。由於 TcpChannel 和 HttpChannel 物件都會實作這兩個介面,因此可用於傳送或接收資訊。
您可以使用下列方式向遠端處理基礎結構註冊通道:
如果您要發行可遠端處理的物件,請在註冊伺服器物件之前呼叫 ChannelServices.RegisterChannel。
如果您要取用可遠端處理物件的功能,請在建立伺服器物件的執行個體之前呼叫 RegisterChannel。
您也可以從遠端處理組態檔載入通道。如需詳細資訊,請參閱組態。
在用戶端上,當訊息周遊完用戶端內容鏈結後,這些訊息會傳遞給用戶端通道接收鏈結。第一個通道接收通常是格式子接收;它會將訊息序列化成資料流,再沿著通道接收鏈結將資料流傳遞給用戶端傳輸接收。然後,用戶端傳輸接收會將這個資料流輸出至 Wire。
在伺服器端上,伺服器傳輸接收會從 Wire 讀取要求,然後將要求資料流傳遞給伺服器通道接收鏈結。在這個鏈結尾端的伺服器格式子接收會將要求還原序列化成訊息。然後,這個訊息會傳遞給遠端處理基礎結構。如需通道接收的詳細資訊,請參閱接收和接收鏈結。
通道規則
用戶端在遠端物件上呼叫方法時,與呼叫相關的參數和其他詳細資料會透過通道傳輸至遠端物件。任何呼叫結果都會以相同方式傳回。用戶端可選取伺服器上所註冊的任意通道,以與遠端物件進行通訊,因此,程式開發人員能夠自由選取最適合他們需求的通道。您也可自訂任何現有的通道,或建置使用不同通訊協定的新通道。選取通道時,需遵守下列規則:
呼叫遠端物件之前,至少必須向伺服器上的遠端處理系統註冊一個通道。必須先註冊通道才能註冊物件。如果未在用戶端上註冊通道,則遠端處理系統會選擇或建立一個通道,以傳送傳出呼叫。
注意事項
如果用戶端需要 callback 函式,則必須在用戶端上註冊接聽通道,且必須將伺服器設定為使用相容通道。
通道是以每個應用程式定義域為單位註冊。單一處理序可包含多個應用程式定義域。處理序結束時,它所註冊的所有通道也會被自動終結。
應用程式定義域內的通道名稱必須是唯一的。例如,因為預設通道已有名稱,所以若要在一個應用程式定義域中註冊兩個 HttpChannel 物件,則在註冊通道之前,必須先變更通道名稱。下列 C# 程式碼範例示範這項功能。
IDictionary prop = new Hashtable(); prop["name"] = "http1"; prop["port"] = "9001"; ChannelServices.RegisterChannel(new HttpChannel(prop, null, null));
不可多次註冊用來接聽特定連接埠的通道。雖然通道是以每個應用程式定義域為單位來註冊,但相同機器上的不同應用程式定義域也不可註冊接聽相同連接埠的相同通道。
如果不確定連接埠是否可用,請在設定通道的連接埠時使用 0 (零),遠端處理系統就會為您選擇可用的連接埠。
用戶端可使用任何註冊的通道與遠端物件進行通訊。遠端處理系統會在用戶端嘗試連接至遠端物件時,確保該遠端物件已連接至正確的通道。在嘗試與遠端物件進行通訊之前,用戶端會負責呼叫 ChannelServices.RegisterChannel。如果用戶端需要 callback 函式,則它必須註冊通道和連接埠。
用戶端在 Proxy 上呼叫方法時,系統會攔截呼叫、將之放到訊息中,然後傳遞給 RealProxy 類別的執行個體。RealProxy 類別會將訊息轉送給訊息接收,以進行處理。訊息接收會建立與遠端物件所註冊之通道的連接,然後透過該通道將訊息分派給原始的應用程式定義域。這時就會解封送處理訊息,並直接呼叫遠端物件本身。
遠端處理在用戶端的定義域中將 Proxy 初始化成遠端物件時,會在選取的通道上呼叫 IChannelSender.CreateMessageSink,藉以從用戶端所設定的通道擷取可與遠端物件進行通訊的訊息接收。
遠端處理系統的一個令人混淆的部分是遠端物件與通道間的關係。例如,如果 WellKnownObjectMode.SingleCall 遠端物件只有在呼叫到達時才會啟動,那麼它是如何接聽要連接的用戶端的。
因為遠端物件共用通道,所以在某種程度上,這是可能的;遠端物件並不擁有通道。裝載遠端物件的伺服器應用程式必須註冊它們所需的通道,以及它們向遠端處理系統公開的物件。通道註冊好時,它會自動開始在特定連接埠上接聽用戶端要求。在同步呼叫的情況下,在訊息呼叫的期間內都會維護來自用戶端的連接。因為每個用戶端連接都有自己的執行緒,所以單一通道可同時服務多個用戶端。