介紹
從結構上看,.NETRemoting對象非常適合通過網路訪問資源,而又無需處理由基於SOAP的Web Service所帶來的難題。對於內部網應用程式而言,Web伺服器和SOAP協定的使用並不是總有效的。當傳輸的數據的量很大時, DCOM協定系統開銷就太大了。在過去開發人員通常使用DCOM編寫程式。有了DCOM,我們習慣於調用均等在伺服器上的對象的方法,.Net Remoting就是DCOM的替代者。與DCOM相比,.Net Remo-ting也可以在Internet解決方案中。在Internet解決方案中,DCOM顯得不太靈活和效率不高。.Net Remoting.不需要創建存根程式和骨架檔案,使用起來比Java的RMI簡單而且為處理區域網路甚至網際網路範圍內的資源提供了一個絕佳的方法,使用範圍比JAVA的RMI更廣泛。使用.Net Remoting框架技術可以匹配和擴展體系結構的每一個部分,不僅增加了它的靈活性,也大大擴展了它的套用範圍。.NET Remoting幾乎適合於所有涉及遠程的工作 。
.NET Remoting的原理
1.NET Remoting的體系結構
NETRemoting的體系結構如圖1所示。
在圖1的客戶端應用程式域和服務端應用程式域的分界線構成了 .NET Remoting 的邊界。在服務端即服務端應用程式域由傳輸通道,序列化格式程式和Server Object組成(運行在伺服器上的對象稱為遠程對象)。在客戶端即客戶應用程式域如圖示由Client Object、代理、傳輸通道、序列化格式程式組成。下面分述幾個重要的概念。
(1)應用程式域 可以將應用程式域看作是一個邏輯進程。在傳統意義上,進程通常被用作隔離的分界線,也就是說,在一進程中運行的應用程式不能訪問和破壞另一個進程,套用域就成為進程中新的安全分界線。
(2)客戶代理 客戶代理分為透明代理和真實代理。其中,透明代理是遠程對象的精確副本,它具有遠程對象所具有的可用的方法調用,它截取了所有對遠程對象的直接方法調用,並將它們傳遞給真實代理。真實代理是具體的處理,它接受透明代理創建的訊息並將其傳送到.NET Remoting基礎設施用於最終傳遞給遠程對象。
(3)傳輸通道 .NET Remoting通過通道穿越.NET Remoting邊界傳輸序列化的訊息對象,它由格式化接收器、通道接收器、傳輸接收器組成。其內部結構如圖2示。
常用的是TCP通道和HTTP通道。TCP通道主要用Internet,HTTP通道主要可以和SOAP協定結合用於Internet,可以穿越防火牆。並且還可以根據需要定製通道,如安全加密通道。
(4)對象激活 對象激活分為伺服器端激活和客戶端激活。伺服器端激活分為Singleton和SingleCall模式。 .NET Remoting將伺服器端激活類型稱為眾所周知的對象類型,伺服器在應用程式激活對象實例之前會在一個眾所周知的統一資源標識符(URI)上發布這個類型。在處理客戶端激活時,與處理伺服器端激活類型相比,.NET Remoting基礎設施激活每個對象實例的時候會給每個客戶端激活的類型指派一個URI。
2..NET Remoting的擴展
.NET Remoting具有良好的擴展性,可以根據需要替代真實代理對象、添加接收器對象、替代格式標識符和通道等。介紹通道的定製,具體如下:
(1)創建客戶端通道類 客戶端通道由三個分別繼承IchannelSender,IclientChannelSinkPvovider,IchannelSink的類構成。Public class SDC ClientChannel:IchannelSender{...},…
(2)創建伺服器端通道類 伺服器端包含兩個類,它們分別繼承IchannelReceiver和IserverChannelSink Public class SDC ServerChannel:IchannelReceive{...},…
(3)創建名為SDC的類 此類存放伺服器和客戶端通道所共享的功能。
(4)創建結合了伺服器端和客戶端類 兩者功能的主通道類:Public class SDC Channel: Ichannel, IchannelReceiver{...}, …
.NET Remoting的分散式套用
在眾多的分散式體系套用中,Peer-to-Peer(簡稱P2P)是近來研究的熱點。在這種模型下,每個客戶端同時也是一個伺服器。此模型與C/S模型主要區別是:應用程式配置Remoting以偵聽客戶端請求,並通過Remoting來調用類。在大多數P2P應用程式中,給定的對等端同時連線到多個其他的對等端。這就意味著不能使用Remoting靜態配置。為此,我們將不在Remoting中註冊遠程類,而是使用.NETFramework中的一種特殊方法來創建遠程對象即Activator. GetObject,它接受兩個參數:第一個是要創建的對象類型;第二個是要在其上創建對象的Remoting主機的URL。編碼如下: