.NET Framework 遠端處理架構
.NET 遠端處理基礎結構是處理序間通訊的抽象方式。當系統運作時,大多不需要注意自身的狀況。例如,不同應用程式定義域中或不同電腦上的應用程式之間,會自動傳遞可用傳值方式 (或複製) 傳遞的物件。您只需要將自訂類別標記為可序列化,即可執行這項動作。
不過,遠端處理系統真正的優點是它提供在下列項目之間進行通訊的能力:不同應用程式定義域中的物件,或使用不同傳輸通訊協定、序列化格式、物件存留期配置和物件建立模式的處理序。此外,不論基於何種原因,您都可利用遠端處理介入通訊處理序的任何階段。
不論您已實作許多分散式應用程式,或只是想要將元件移至其他電腦以增加程式的延展性,都可將遠端處理系統想成一個適用於處理序間通訊的泛型系統,其包含可輕鬆應付大多數案例的預設實作。以下將從使用遠端處理進行處理序間通訊的基本概念開始討論。
在跨處理序通訊中,需要有一個提供功能給其處理序外部之呼叫端的伺服器物件、一個呼叫伺服器物件的用戶端,以及將呼叫從一端傳送至另一端的傳輸機制。伺服器方法的位址是邏輯位址,其可在一個處理序中正常運作,但無法在不同用戶端處理序中運作。為了要減緩這個問題,用戶端可先建立伺服器物件的完整複本、將它移至用戶端處理序 (以在其中直接叫用複本的方法),再呼叫該物件。
不過,許多物件都不可或不應透過複製,再移至某個其他處理序來執行。具有大量方法的特大型物件最不適合選做複製 (或以傳值方式傳遞) 至其他處理序的對象。通常用戶端只需要伺服器物件上之一或多個方法所傳回的資訊。複製整個伺服器物件 (包含與用戶端需求無關的大量內部資訊或可執行結構) 將會浪費頻寬、用戶端記憶體和處理時間。此外,許多物件雖然是公開公用功能,但卻需要在內部執行私用資料。複製這些物件可讓未授權的用戶端檢查內部資料,因而造成潛在的安全性問題。最後,有些物件會使用無法以一般方式複製的資料。例如,FileInfo 物件包含作業系統檔案的參考,而這個檔案在伺服器處理序的記憶體中具有唯一的位址。您可複製這個位址,但這個位址在另一個處理序中不具任何意義。
在上述情況下,伺服器處理序應將伺服器物件的參考傳遞到用戶端處理序,而非傳遞物件複本。用戶端可使用這個參考呼叫伺服器物件。這些呼叫並不會在用戶端處理序中執行。相反的,遠端處理系統會收集關於呼叫的所有資訊、將資訊傳送給伺服器處理序、在這個處理序中進行解譯、找出正確的伺服器物件,再代表用戶端物件呼叫該伺服器物件。然後,呼叫結果會傳回給用戶端處理序,以交回給用戶端。頻寬只用於重要資訊,也就是呼叫、呼叫引數和任何傳回值或例外狀況。
使用物件參考在伺服器物件與用戶端間進行通訊,是遠端處理的核心。不過,遠端處理架構可提供程式設計人員更簡易的程序。適當設定用戶端之後,您只需要使用 new (或您 Managed 程式語言的執行個體建立函式) 建立遠端物件的新執行個體。您的用戶端會收到伺服器物件的參考,然後,您可呼叫它的方法,就像物件是在您的處理序中,而不是在其他電腦上執行一樣。遠端處理系統會使用 Proxy 物件,建立伺服器物件就在用戶端處理序中的假相。Proxy 是內建物件,用於假裝某個其他物件。當用戶端建立遠端型別的執行個體時,遠端處理基礎結構會建立 Proxy 物件,對用戶端而言,這個 Proxy 物件看來就像是該遠端型別。您的用戶端會在該 Proxy 上呼叫方法,而遠端處理系統會收到呼叫、將它路由傳送至伺服器處理序、叫用伺服器物件,然後將傳回值傳回給用戶端 Proxy,由該 Proxy 將結果傳回給用戶端。
遠端呼叫必須以某種方式在用戶端與伺服器處理序之間進行溝通。如果您是自行建置遠端處理系統,則可能需要先開始學習網路程式設計,以及各種通訊協定和序列化格式規格。在 .NET 遠端處理系統中,開啟網路連接和使用特定通訊協定將位元組傳送至接收應用程式所需的基礎技術,都已整合為傳輸通道。
通道是一種型別,其可接收資料的資料流、依據特定網路通訊協定建立套件,並將套件傳送給另一部電腦。有些通道只可接收資訊,有些通道只可傳送資訊,有些通道 (如預設的 TcpChannel 和 HttpChannel 類別) 則可接收和傳送資訊 (但需單向執行)。
雖然伺服器處理序知道每個唯一型別所有的資訊,但是用戶端只知道它要參考另一個應用程式定義域 (可能在另一部電腦上) 中的物件。對於在伺服器應用程式定義域之外的世界而言,物件的位置是由 URL 定義。對外界而言,表示唯一型別的 URL 是啟動 URL,其可確保對正確型別進行遠端呼叫。如需詳細資訊,請參閱啟動 URL。
假設某部電腦上執行的應用程式,想要使用另一部電腦上儲存之型別所公開的功能。下圖顯示一般的遠端處理處理序。
遠端處理處理序
如果關係的兩端設定正確,則用戶端只會建立伺服器類別的新執行個體。遠端處理系統會建立表示該類別的 Proxy 物件,並將 Proxy 參考傳回給用戶端物件。當用戶端呼叫方法時,遠端處理基礎結構會處理該呼叫、檢查型別資訊,並透過通道將呼叫傳送給伺服器處理序。接聽的通道會拾取要求,並將它轉送給伺服器遠端處理系統,由這個伺服器遠端處理系統尋找 (如果需要的話,則為建立) 並呼叫所要求的物件。接著便是相反的處理序:伺服器遠端處理系統會將回應放到訊息中,由伺服器通道將該訊息傳送給用戶端通道。最後,用戶端遠端處理系統會透過 Proxy 將呼叫結果傳回給用戶端物件。
雖然要做到這樣的處理實際上只需要極少數的程式碼,但仍應考慮到關係的設計和組態。即使程式碼完全正確,但只要 URL 或連接埠號碼不正確,作業仍然會失敗。如需詳細資訊,請參閱組態。
雖然這份遠端處理處理序的高階概觀所介紹的觀念直接易懂,但是詳細細節十分複雜。以下列出的其他主題,將會進一步討論遠端處理的主要項目。