Remoting简介
生活随笔
收集整理的這篇文章主要介紹了
Remoting简介
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
什么是Remoting,簡而言之,我們可以將其看作是一種分布式處理方式。從微軟的產(chǎn)品角度來看,可以說Remoting就是DCOM的一種升級,它改善了很多功能,并極好的融合到.Net平臺下。Microsoft? .NET Remoting 提供了一種允許對象通過應(yīng)用程序域與另一對象進(jìn)行交互的框架。這也正是我們使用Remoting的原因。為什么呢?在Windows操作系統(tǒng)中,是將應(yīng)用程序分離為單獨(dú)的進(jìn)程。這個進(jìn)程形成了應(yīng)用程序代碼和數(shù)據(jù)周圍的一道邊界。如果不采用進(jìn)程間通信(RPC)機(jī)制,則在一個進(jìn)程中執(zhí)行的代碼就不能訪問另一進(jìn)程。這是一種操作系統(tǒng)對應(yīng)用程序的保護(hù)機(jī)制。然而在某些情況下,我們需要跨過應(yīng)用程序域,與另外的應(yīng)用程序域進(jìn)行通信,即穿越邊界。
在Remoting中是通過通道(channel)來實(shí)現(xiàn)兩個應(yīng)用程序域之間對象的通信的。首先,客戶端通過Remoting,訪問通道以獲得服務(wù)端對象,再通過代理解析為客戶端對象。這就提供一種可能性,即以服務(wù)的方式來發(fā)布服務(wù)器對象。遠(yuǎn)程對象代碼可以運(yùn)行在服務(wù)器上(如服務(wù)器激活的對象和客戶端激活的對象),然后客戶端再通過Remoting連接服務(wù)器,獲得該服務(wù)對象并通過序列化在客戶端運(yùn)行。
在Remoting中,對于要傳遞的對象,設(shè)計(jì)者除了需要了解通道的類型和端口號之外,無需再了解數(shù)據(jù)包的格式。但必須注意的是,客戶端在獲取服務(wù)器端對象時,并不是獲得實(shí)際的服務(wù)端對象,而是獲得它的引用。這既保證了客戶端和服務(wù)器端有關(guān)對象的松散耦合,同時也優(yōu)化了通信的性能。
Remoting的兩種通道
Remoting的通道主要有兩種:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定義了 IChannel接口。IChannel接口包括了TcpChannel通道類型和Http通道類型。它們分別對應(yīng)Remoting通道的這兩種類型。
TcpChannel類型放在名字空間System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket 的傳輸工具,使用Tcp協(xié)議來跨越Remoting邊界傳輸序列化的消息流。TcpChannel類型默認(rèn)使用二進(jìn)制格式序列化消息對象,因此它具有更高的傳輸性能。HttpChannel類型放在名字空間System.Runtime.Remoting.Channel.Http中。它提供了一種使用 Http協(xié)議,使其能在Internet上穿越防火墻傳輸序列化消息流。默認(rèn)情況下,HttpChannel類型使用Soap格式序列化消息對象,因此它具有更好的互操作性。通常在局域網(wǎng)內(nèi),我們更多地使用TcpChannel;如果要穿越防火墻,則使用HttpChannel。
遠(yuǎn)程對象的激活方式
在訪問遠(yuǎn)程類型的一個對象實(shí)例之前,必須通過一個名為Activation的進(jìn)程創(chuàng)建它并進(jìn)行初始化。這種客戶端通過通道來創(chuàng)建遠(yuǎn)程對象,稱為對象的激活。在Remoting中,遠(yuǎn)程對象的激活分為兩大類:服務(wù)器端激活和客戶端激活。
服務(wù)器端激活,又叫做WellKnow方式,很多又翻譯為知名對象。為什么稱為知名對象激活模式呢?是因?yàn)榉?wù)器應(yīng)用程序在激活對象實(shí)例之前會在一個眾所周知的統(tǒng)一資源標(biāo)識符(URI)上來發(fā)布這個類型。然后該服務(wù)器進(jìn)程會為此類型配置一個WellKnown對象,并根據(jù)指定的端口或地址來發(fā)布對象。. Net Remoting把服務(wù)器端激活又分為SingleTon模式和SingleCall模式兩種。
SingleTon模式:此為有狀態(tài)模式。如果設(shè)置為SingleTon激活方式,則Remoting將為所有客戶端建立同一個對象實(shí)例。當(dāng)對象處于活動狀態(tài)時, SingleTon實(shí)例會處理所有后來的客戶端訪問請求,而不管它們是同一個客戶端,還是其他客戶端。SingleTon實(shí)例將在方法調(diào)用中一直維持其狀態(tài)。舉例來說,如果一個遠(yuǎn)程對象有一個累加方法(i=0;++i),被多個客戶端(例如兩個)調(diào)用。如果設(shè)置為SingleTon方式,則第一個客戶獲得值為1,第二個客戶獲得值為2,因?yàn)樗麄儷@得的對象實(shí)例是相同的。如果熟悉Asp.Net的狀態(tài)管理,我們可以認(rèn)為它是一種Application狀態(tài)。
SingleCall模式:SingleCall是一種無狀態(tài)模式。一旦設(shè)置為SingleCall模式,則當(dāng)客戶端調(diào)用遠(yuǎn)程對象的方法時, Remoting會為每一個客戶端建立一個遠(yuǎn)程對象實(shí)例,至于對象實(shí)例的銷毀則是由GC自動管理的。同上一個例子而言,則訪問遠(yuǎn)程對象的兩個客戶獲得的都是1。我們?nèi)匀豢梢越梃bAsp.Net的狀態(tài)管理,認(rèn)為它是一種Session狀態(tài)。
客戶端激活。與WellKnown模式不同, Remoting在激活每個對象實(shí)例的時候,會給每個客戶端激活的類型指派一個URI。客戶端激活模式一旦獲得客戶端的請求,將為每一個客戶端都建立一個實(shí)例引用。SingleCall模式和客戶端激活模式是有區(qū)別的:首先,對象實(shí)例創(chuàng)建的時間不一樣。客戶端激活方式是客戶一旦發(fā)出調(diào)用的請求,就實(shí)例化;而SingleCall則是要等到調(diào)用對象方法時再創(chuàng)建。其次,SingleCall模式激活的對象是無狀態(tài)的,對象生命期的管理是由GC管理的,而客戶端激活的對象則有狀態(tài),其生命周期可自定義。其三,兩種激活模式在服務(wù)器端和客戶端實(shí)現(xiàn)的方法不一樣。尤其是在客戶端,SingleCall模式是由 GetObject()來激活,它調(diào)用對象默認(rèn)的構(gòu)造函數(shù)。而客戶端激活模式,則通過CreateInstance()來激活,它可以傳遞參數(shù),所以可以調(diào)用自定義的構(gòu)造函數(shù)來創(chuàng)建實(shí)例。
遠(yuǎn)程對象的定義
前面講到,客戶端在獲取服務(wù)器端對象時,并不是獲得實(shí)際的服務(wù)端對象,而是獲得它的引用。因此在Remoting中,對于遠(yuǎn)程對象有一些必須的定義規(guī)范要遵循。
由于Remoting傳遞的對象是以引用的方式,因此所傳遞的遠(yuǎn)程對象類必須繼承MarshalByRefObject。MSDN對 MarshalByRefObject的說明是:MarshalByRefObject 是那些通過使用代理交換消息來跨越應(yīng)用程序域邊界進(jìn)行通信的對象的基類。不是從 MarshalByRefObject 繼承的對象會以隱式方式按值封送。當(dāng)遠(yuǎn)程應(yīng)用程序引用一個按值封送的對象時,將跨越遠(yuǎn)程處理邊界傳遞該對象的副本。因?yàn)槟M褂么矸椒ǘ皇歉北痉椒ㄟM(jìn)行通信,因此需要繼承MarshallByRefObject。
在Remoting中能夠傳遞的遠(yuǎn)程對象可以是各種類型,包括復(fù)雜的DataSet對象,只要它能夠被序列化。遠(yuǎn)程對象也可以包含事件,但服務(wù)器端對于事件的處理比較特殊,我將在本系列之三中介紹。
服務(wù)器端
根據(jù)第一部分所述,根據(jù)激活模式的不同,通道類型的不同服務(wù)器端的實(shí)現(xiàn)方式也有所不同。大體上說,服務(wù)器端應(yīng)分為三步:
1、注冊通道
要跨越應(yīng)用程序域進(jìn)行通信,必須實(shí)現(xiàn)通道。如前所述,Remoting提供了IChannel接口,分別包含TcpChannel和 HttpChannel兩種類型的通道。這兩種類型除了性能和序列化數(shù)據(jù)的格式不同外,實(shí)現(xiàn)的方式完全一致,因此下面我們就以TcpChannel為例。
注冊TcpChannel,首先要在項(xiàng)目中添加引用“System.Runtime.Remoting”,然后using名字空間: System.Runtime.Remoting.Channel.Tcp。在實(shí)例化通道對象時,將端口號作為參數(shù)傳遞。然后再調(diào)用靜態(tài)方法 RegisterChannel()來注冊該通道對象即可。
2、注冊遠(yuǎn)程對象
注冊了通道后,要能激活遠(yuǎn)程對象,必須在通道中注冊該對象。根據(jù)激活模式的不同,注冊對象的方法也不同。
對于WellKnown對象,可以通過靜態(tài)方法 RemotingConfiguration.RegisterWellKnownServiceType()來實(shí)現(xiàn),注冊對象的方法基本上和 SingleTon模式相同,只需要將枚舉參數(shù)WellKnownObjectMode改為SingleCall就可以了。
3、注銷通道
如果要關(guān)閉Remoting的服務(wù),則需要注銷通道,也可以關(guān)閉對通道的監(jiān)聽。在Remoting中當(dāng)我們注冊通道的時候,就自動開啟了通道的監(jiān)聽。而如果關(guān)閉了對通道的監(jiān)聽,則該通道就無法接受客戶端的請求,但通道仍然存在,如果你想再一次注冊該通道,會拋出異常。
在Remoting中是通過通道(channel)來實(shí)現(xiàn)兩個應(yīng)用程序域之間對象的通信的。首先,客戶端通過Remoting,訪問通道以獲得服務(wù)端對象,再通過代理解析為客戶端對象。這就提供一種可能性,即以服務(wù)的方式來發(fā)布服務(wù)器對象。遠(yuǎn)程對象代碼可以運(yùn)行在服務(wù)器上(如服務(wù)器激活的對象和客戶端激活的對象),然后客戶端再通過Remoting連接服務(wù)器,獲得該服務(wù)對象并通過序列化在客戶端運(yùn)行。
在Remoting中,對于要傳遞的對象,設(shè)計(jì)者除了需要了解通道的類型和端口號之外,無需再了解數(shù)據(jù)包的格式。但必須注意的是,客戶端在獲取服務(wù)器端對象時,并不是獲得實(shí)際的服務(wù)端對象,而是獲得它的引用。這既保證了客戶端和服務(wù)器端有關(guān)對象的松散耦合,同時也優(yōu)化了通信的性能。
Remoting的兩種通道
Remoting的通道主要有兩種:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定義了 IChannel接口。IChannel接口包括了TcpChannel通道類型和Http通道類型。它們分別對應(yīng)Remoting通道的這兩種類型。
TcpChannel類型放在名字空間System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket 的傳輸工具,使用Tcp協(xié)議來跨越Remoting邊界傳輸序列化的消息流。TcpChannel類型默認(rèn)使用二進(jìn)制格式序列化消息對象,因此它具有更高的傳輸性能。HttpChannel類型放在名字空間System.Runtime.Remoting.Channel.Http中。它提供了一種使用 Http協(xié)議,使其能在Internet上穿越防火墻傳輸序列化消息流。默認(rèn)情況下,HttpChannel類型使用Soap格式序列化消息對象,因此它具有更好的互操作性。通常在局域網(wǎng)內(nèi),我們更多地使用TcpChannel;如果要穿越防火墻,則使用HttpChannel。
遠(yuǎn)程對象的激活方式
在訪問遠(yuǎn)程類型的一個對象實(shí)例之前,必須通過一個名為Activation的進(jìn)程創(chuàng)建它并進(jìn)行初始化。這種客戶端通過通道來創(chuàng)建遠(yuǎn)程對象,稱為對象的激活。在Remoting中,遠(yuǎn)程對象的激活分為兩大類:服務(wù)器端激活和客戶端激活。
服務(wù)器端激活,又叫做WellKnow方式,很多又翻譯為知名對象。為什么稱為知名對象激活模式呢?是因?yàn)榉?wù)器應(yīng)用程序在激活對象實(shí)例之前會在一個眾所周知的統(tǒng)一資源標(biāo)識符(URI)上來發(fā)布這個類型。然后該服務(wù)器進(jìn)程會為此類型配置一個WellKnown對象,并根據(jù)指定的端口或地址來發(fā)布對象。. Net Remoting把服務(wù)器端激活又分為SingleTon模式和SingleCall模式兩種。
SingleTon模式:此為有狀態(tài)模式。如果設(shè)置為SingleTon激活方式,則Remoting將為所有客戶端建立同一個對象實(shí)例。當(dāng)對象處于活動狀態(tài)時, SingleTon實(shí)例會處理所有后來的客戶端訪問請求,而不管它們是同一個客戶端,還是其他客戶端。SingleTon實(shí)例將在方法調(diào)用中一直維持其狀態(tài)。舉例來說,如果一個遠(yuǎn)程對象有一個累加方法(i=0;++i),被多個客戶端(例如兩個)調(diào)用。如果設(shè)置為SingleTon方式,則第一個客戶獲得值為1,第二個客戶獲得值為2,因?yàn)樗麄儷@得的對象實(shí)例是相同的。如果熟悉Asp.Net的狀態(tài)管理,我們可以認(rèn)為它是一種Application狀態(tài)。
SingleCall模式:SingleCall是一種無狀態(tài)模式。一旦設(shè)置為SingleCall模式,則當(dāng)客戶端調(diào)用遠(yuǎn)程對象的方法時, Remoting會為每一個客戶端建立一個遠(yuǎn)程對象實(shí)例,至于對象實(shí)例的銷毀則是由GC自動管理的。同上一個例子而言,則訪問遠(yuǎn)程對象的兩個客戶獲得的都是1。我們?nèi)匀豢梢越梃bAsp.Net的狀態(tài)管理,認(rèn)為它是一種Session狀態(tài)。
客戶端激活。與WellKnown模式不同, Remoting在激活每個對象實(shí)例的時候,會給每個客戶端激活的類型指派一個URI。客戶端激活模式一旦獲得客戶端的請求,將為每一個客戶端都建立一個實(shí)例引用。SingleCall模式和客戶端激活模式是有區(qū)別的:首先,對象實(shí)例創(chuàng)建的時間不一樣。客戶端激活方式是客戶一旦發(fā)出調(diào)用的請求,就實(shí)例化;而SingleCall則是要等到調(diào)用對象方法時再創(chuàng)建。其次,SingleCall模式激活的對象是無狀態(tài)的,對象生命期的管理是由GC管理的,而客戶端激活的對象則有狀態(tài),其生命周期可自定義。其三,兩種激活模式在服務(wù)器端和客戶端實(shí)現(xiàn)的方法不一樣。尤其是在客戶端,SingleCall模式是由 GetObject()來激活,它調(diào)用對象默認(rèn)的構(gòu)造函數(shù)。而客戶端激活模式,則通過CreateInstance()來激活,它可以傳遞參數(shù),所以可以調(diào)用自定義的構(gòu)造函數(shù)來創(chuàng)建實(shí)例。
遠(yuǎn)程對象的定義
前面講到,客戶端在獲取服務(wù)器端對象時,并不是獲得實(shí)際的服務(wù)端對象,而是獲得它的引用。因此在Remoting中,對于遠(yuǎn)程對象有一些必須的定義規(guī)范要遵循。
由于Remoting傳遞的對象是以引用的方式,因此所傳遞的遠(yuǎn)程對象類必須繼承MarshalByRefObject。MSDN對 MarshalByRefObject的說明是:MarshalByRefObject 是那些通過使用代理交換消息來跨越應(yīng)用程序域邊界進(jìn)行通信的對象的基類。不是從 MarshalByRefObject 繼承的對象會以隱式方式按值封送。當(dāng)遠(yuǎn)程應(yīng)用程序引用一個按值封送的對象時,將跨越遠(yuǎn)程處理邊界傳遞該對象的副本。因?yàn)槟M褂么矸椒ǘ皇歉北痉椒ㄟM(jìn)行通信,因此需要繼承MarshallByRefObject。
在Remoting中能夠傳遞的遠(yuǎn)程對象可以是各種類型,包括復(fù)雜的DataSet對象,只要它能夠被序列化。遠(yuǎn)程對象也可以包含事件,但服務(wù)器端對于事件的處理比較特殊,我將在本系列之三中介紹。
服務(wù)器端
根據(jù)第一部分所述,根據(jù)激活模式的不同,通道類型的不同服務(wù)器端的實(shí)現(xiàn)方式也有所不同。大體上說,服務(wù)器端應(yīng)分為三步:
1、注冊通道
要跨越應(yīng)用程序域進(jìn)行通信,必須實(shí)現(xiàn)通道。如前所述,Remoting提供了IChannel接口,分別包含TcpChannel和 HttpChannel兩種類型的通道。這兩種類型除了性能和序列化數(shù)據(jù)的格式不同外,實(shí)現(xiàn)的方式完全一致,因此下面我們就以TcpChannel為例。
注冊TcpChannel,首先要在項(xiàng)目中添加引用“System.Runtime.Remoting”,然后using名字空間: System.Runtime.Remoting.Channel.Tcp。在實(shí)例化通道對象時,將端口號作為參數(shù)傳遞。然后再調(diào)用靜態(tài)方法 RegisterChannel()來注冊該通道對象即可。
2、注冊遠(yuǎn)程對象
注冊了通道后,要能激活遠(yuǎn)程對象,必須在通道中注冊該對象。根據(jù)激活模式的不同,注冊對象的方法也不同。
對于WellKnown對象,可以通過靜態(tài)方法 RemotingConfiguration.RegisterWellKnownServiceType()來實(shí)現(xiàn),注冊對象的方法基本上和 SingleTon模式相同,只需要將枚舉參數(shù)WellKnownObjectMode改為SingleCall就可以了。
3、注銷通道
如果要關(guān)閉Remoting的服務(wù),則需要注銷通道,也可以關(guān)閉對通道的監(jiān)聽。在Remoting中當(dāng)我們注冊通道的時候,就自動開啟了通道的監(jiān)聽。而如果關(guān)閉了對通道的監(jiān)聽,則該通道就無法接受客戶端的請求,但通道仍然存在,如果你想再一次注冊該通道,會拋出異常。
轉(zhuǎn)載于:https://www.cnblogs.com/xiaolinzi/archive/2008/04/30/1177770.html
總結(jié)
以上是生活随笔為你收集整理的Remoting简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xaml中的布局面板
- 下一篇: 堆与栈的区别