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