【分享】C# Remoting 簡介

來源:互聯網
上載者:User
網上找到C# Remoting 簡介的知識,覺得還是比較容易理解的,分享給大家
 
一.Remoting 有兩種通道:1.TcpChannel通道2.Http通道類型二.遠程對象的啟用方式1.伺服器端啟用,又稱 WellKnow 方式。伺服器端啟用又分為SingleTon和SingleCall兩種模式。SingleTon模式:此為有狀態模式。如果設定為SingleTon啟用方式,則Remoting將為所有用戶端建立同一個對象執行個體。當對象處於活動狀態時,SingleTon執行個體會處理所有後來的用戶端訪問請求,而不管它們是同一個用戶端,還是其他用戶端。SingleTon執行個體將在方法調用中一直維持其狀態。舉例來說,如果一個遠程對象有一個累加方法(i=0;++i),被多個用戶端(例如兩個)調用。如果設定為SingleTon方式,則第一個客戶獲得值為1,第二個客戶獲得值為2,因為他們獲得的對象執行個體是相同的。如果熟悉Asp.Net的狀態管理,我們可以認為它是一種Application狀態。SingleCall模式:SingleCall是一種無狀態模式。一旦設定為SingleCall模式,則當用戶端調用遠程對象的方法時,Remoting會為每一個用戶端建立一個遠程對象執行個體,至於對象執行個體的銷毀則是由GC自動管理的。同上一個例子而言,則訪問遠程對象的兩個客戶獲得的都是1。我們仍然可以借鑒Asp.Net的狀態管理,認為它是一種Session狀態。2.用戶端啟用。與WellKnown模式不同,Remoting在啟用每個對象執行個體的時候,會給每個用戶端啟用的類型指派一個URI。用戶端啟用模式一旦獲得用戶端的請求,將為每一個用戶端都建立一個執行個體引用。SingleCall模式和用戶端啟用模式是有區別的:首先,對象執行個體建立的時間不一樣。用戶端啟用方式是客戶一旦發出調用的請求,就執行個體化;而SingleCall則是要等到調用對象方法時再建立。其次,SingleCall模式啟用的對象是無狀態的,對象生命期的管理是由GC管理的,而用戶端啟用的對象則有狀態,其生命週期可自訂。其三,兩種啟用模式在伺服器端和用戶端實現的方法不一樣。尤其是在用戶端,SingleCall模式是由GetObject()來啟用,它調用對象預設的建構函式。而用戶端啟用模式,則通過CreateInstance()來啟用,它可以傳遞參數,所以可以調用自訂的建構函式來建立執行個體。根據啟用模式的不同,通道類型的不同伺服器端的實現方式也有所不同。大體上說,伺服器端應分為三步:1、註冊通道要跨越應用程式定義域進行通訊,必須實現通道。如前所述,Remoting提供了IChannel介面,分別包含TcpChannel和HttpChannel兩種類型的通道。這兩種類型除了效能和序列化資料的格式不同外,實現的方式完全一致,因此下面我們就以TcpChannel為例。註冊TcpChannel,首先要在項目中添加引用“System.Runtime.Remoting”,然後using名字空間:System.Runtime.Remoting.Channel.Tcp。代碼如下:            TcpChannel channel = new TcpChannel(8080);            ChannelServices.RegisterChannel(channel);在執行個體化通道對象時,將連接埠號碼作為參數傳遞。然後再調用靜態方法RegisterChannel()來註冊該通道對象即可。2、註冊遠程對象註冊了通道後,要能啟用遠程對象,必須在通道中註冊該對象。根據啟用模式的不同,註冊對象的方法也不同。(1) SingleTon模式對於WellKnown對象,可以通過靜態方法RemotingConfiguration.RegisterWellKnownServiceType()來實現:RemotingConfiguration.RegisterWellKnownServiceType(                typeof(ServerRemoteObject.ServerObject),                "ServiceMessage",WellKnownObjectMode.SingleTon);(2)SingleCall模式註冊對象的方法基本上和SingleTon模式相同,只需要將枚舉參數WellKnownObjectMode改為SingleCall就可以了。RemotingConfiguration.RegisterWellKnownServiceType(                typeof(ServerRemoteObject.ServerObject),                "ServiceMessage",WellKnownObjectMode.SingleCall);(3)用戶端啟用模式對於用戶端啟用模式,使用的方法又有不同,但區別不大,看了代碼就一目瞭然。RemotingConfiguration.ApplicationName = "ServiceMessage";RemotingConfiguration.RegisterActivatedServiceType(                typeof(ServerRemoteObject.ServerObject));為什麼要在註冊對象方法前設定ApplicationName屬性呢?其實這個屬性就是該對象的URI。對於WellKnown模式,URI是放在RegisterWellKnownServiceType()方法的參數中,當然也可以拿出來專門對ApplicationName屬性賦值。而RegisterActivatedServiceType()方法的重載中,沒有ApplicationName的參數,所以必須分開。3、登出通道如果要關閉Remoting的服務,則需要登出通道,也可以關閉對通道的監聽。在Remoting中當我們註冊通道的時候,就自動開啟了通道的監聽。而如果關閉了對通道的監聽,則該通道就無法接受用戶端的請求,但通道仍然存在,如果你想再一次註冊該通道,會拋出異常。           //獲得當前登入的通道;            IChannel[] channels = ChannelServices.RegisteredChannels;            //關閉指定名為MyTcp的通道;            foreach (IChannel eachChannel in channels)            {                if (eachChannel.ChannelName == "MyTcp")                {                    TcpChannel tcpChannel = (TcpChannel)eachChannel;                    //關閉監聽;                    tcpChannel.StopListening(null);                    //登出通道;                    ChannelServices.UnregisterChannel(tcpChannel);                }            }代碼中,RegisterdChannel屬性獲得的是當前登入的通道。在Remoting中,是允許同時註冊多個通道的。 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.