您好,登錄后才能下訂單哦!
在.NET1.0版本出來的時候,要想進行遠程調用基本上都是通過WebService的方式。而隨著.NET2.0版本的出現,我們可以通過一個更加方便且高擴展性的框架來進行編寫遠程調用的程序,也就是我們都比較熟悉的.NetRemoting。
網上對.NetRemoting技術講解的文章不計其數,但是很少有一本比較全面的、系統的學習書籍。我們都是從哪些零散的知識里慢慢摸索,效果不太理想。
今天我也來簡單的介紹一下我理解的Remoting。不仔細研究一下還真不知道它的厲害,完全的托管平臺、高擴展性、靈活性。框架完全采用面向接口編程,任何一個點我們都能提供自己的實現,信道、格式化器、租約、贊助方等等,系統都為我們預留了擴展的接口。[王清培版權所有,轉載請給出署名]
在本人的“.NET簡談組件程序設計之(AppDomain應用程序域) ”一章中我簡單的介紹了.NET托管運行時環境應用程序域(AppDomain)的概念。任何跨越應用程序域的訪問.NET都將它視為遠程調用,不管是在同一個進程中的兩個應用程序域,還是一臺PC上的兩個進程中的兩個應用程序域,還是跨越網絡的兩個應用程序域,.NET都通過代理的方式進行調用。
其實在一個進程中的兩個應用程序域交互相對而言是簡單的。當我們在默認的應用程序域中創建一個新的AppDomain對象,只需要實例化一個AppDomian然后通過MarshalByRefObject的CreateRefObject方法創建一個ObjRef將其新的應用程序域的代理所需要的所有信息帶到客戶端應用程序域中來,因為AppDomain也是派生與MarshalByRefObject類。后續的操作都是通過代理進行調用的,所有在域中創建的對象都不可能跑出來,只能被按值封送或者按引用封送。
同一個進程中的兩個應用程序域共享一個物理進行空間,而線程是路徑的物理執行單位,在CPU執行的時候才不管你是啥域,直接穿越。所以如果我們在同一個進程中用線程來進行處理的話,無需關心應用程序域的概念,但是這樣有很多潛在的威脅,比如上下文安全、組件服務等都是要嚴格控制調用鏈的,在組件服務中都是通過上下文攔截來進行服務的調用,所以不提倡用線程來穿越域。詳情請查看.NET企業服務相關技術。[王清培版權所有,轉載請給出署名]
然而如果是跨進程的或者跨網絡的遠程調用就沒這么簡單了,當然這個不簡單我們無需擔心,NET為我們做好了。我們試著分析一下,如果要遠程調用該會涉及哪些技術,這樣便于我們有自主學習的能動力。
我們設想一下,.NET托管對象都宿主在物理進程中的,要想不同進程之間的通訊操作系統為我們提供了IPC技術,要想不同網絡之間的進程通訊操作系統為我們提供了Socket。那么如果一個進程中的應用程序域想調用另一個進程中的應用程序域的對象必須通過物理進程的承載才行,也就是涉及到了IPC的調用。如果一個網絡中的一個進程中的應用程序域想調用另一個網絡中的進程中的應用程序域中的對象,就得通過操作系統為我們提供的Socket技術。[任何高層的應用均是建立在底層基礎之上的]
同一臺機器之間的調用:
不同機器之間的調用:
上面兩幅圖基本上就是對象之間的調用過程。看起來確實比較復雜,但是.NET為我們做了個很好的統一的遠程處理框架.NetRemoting,我們只需要簡單的配置就能很方便的進程遠程調用。[王清培版權所有,轉載請給出署名]
這篇文章是.NetRemoting的一個開篇鋪墊吧,沒涉及到多少Remoting的技術,但是這篇文章里面所講的內容正是Remoting實現的類型,只有清楚的理解了這些關系之后我們才能很好的運用Remoting。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。