初識用.NET Remoting來開發分散式應用(轉)

weixin_33860553發表於2009-08-07

一..NET Remoting簡介:

.NET Remoting從某種意義上講是DCOM的替代品。ASP.NET Web服務十分有用,但是這項技術在企業內聯網的解決方案中,對於某些業務請求來說並不快,也沒有足夠的靈活性,而且,ASP.NET Web服務需要有執行時的支援。使用.NET Remoting技術後,可以將Web服務提供給世界上的任何地方。而且可以在所有的應用程式型別中執行Web服務。

二..NET Remoting 的基本原理:

體系結構圖如下:

 

三.幾個重要的概念:

1.遠端物件:

遠端物件類是從MarshalByRefObject類中派生的。跨越應用程式域呼叫這個類需要使用代理。.NET Remoting支援兩種型別的遠端物件:知名的(Well-known)遠端物件和客戶啟用(Client-activated)遠端物件。遠端物件其實包括兩層含義:

操作遠端物件:物件執行在遠端,客戶段向他傳送訊息;

傳遞遠端物件:將遠端物件拿到本地,或者將本地物件傳送過去,對副本進行操作。

2.啟用:

使用new運算子可以啟用遠端物件。還有其它一些方式也可以啟用遠端物件,在以後的隨筆裡面我會介紹。

3.通道:

一個遠端物件使用通道傳送和接收訊息。伺服器選擇一個通道來監聽請求,客戶端選擇通道來和伺服器通訊。Remoting提供了內建的通道:TCP通道和HTTP通道,我們也可以編寫自己的通道。

4.編組:

陣列通過應用程式域被傳遞的過程稱為編組。將變數作為遠端物件的引數來傳送時,這個變數必須被轉換,以便能夠通過應用程式域傳送該變數。

5.監聽:

使用監聽,能夠將某些功能置入到方法呼叫鏈中。如果呼叫某個物件的方法,監聽層便能夠捕獲呼叫來轉換方法呼叫,或是完成某些日誌記錄。.NET Remoting呼叫鏈的每一部分都是用監聽。

四.開發Remoting三步走:

開發.NET Remoting分三步走,在這裡以一個簡單的例子來說明。

1.建立遠端物件:

繼承System.MarshalByRefObject

 1using System;
 2using System.Collections;
 3using System.Text;
 4
 5namespace SimpleRemoting
 6ExpandedBlockStart.gifContractedBlock.gif{
 7    public class HelloServer : MarshalByRefObject
 8ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 9        public HelloServer()
10ExpandedSubBlockStart.gifContractedSubBlock.gif        {
11ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////輸出資訊,伺服器啟用
12            Console.WriteLine("伺服器啟用……");
13        }

14        public String HelloMethod(String name)
15ExpandedSubBlockStart.gifContractedSubBlock.gif        {
16            Console.WriteLine(
17                "伺服器端 : {0}", name);
18            return "這裡是:" + name;
19        }

20    }

21}


2.建立宿主應用程式:

註冊通道

註冊伺服器啟用的遠端物件

執行宿主程式

 1using System;
 2using System.Net;
 3using System.Runtime.Remoting;
 4using System.Runtime.Remoting.Channels;
 5using System.Runtime.Remoting.Channels.Tcp;
 6using System.Runtime.Remoting.Channels.Http;
 7
 8namespace SimpleRemoting 
 9ExpandedBlockStart.gifContractedBlock.gif{
10
11    public class Server
12ExpandedSubBlockStart.gifContractedSubBlock.gif    {
13        public static int Main(string [] args) 
14ExpandedSubBlockStart.gifContractedSubBlock.gif        {
15            
16ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////建立Tcp通道
17            TcpChannel chan1 = new TcpChannel(8085);
18
19ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////建立Http通道
20            HttpChannel chan2 = new HttpChannel(8086);
21            
22ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////註冊通道
23            ChannelServices.RegisterChannel(chan1);
24            ChannelServices.RegisterChannel(chan2);
25
26            RemotingConfiguration.RegisterWellKnownServiceType
27                (
28                typeof(HelloServer),
29                "SayHello",
30                WellKnownObjectMode.Singleton
31                );
32            
33
34            System.Console.WriteLine("按任意鍵退出!");
35ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////下面這行不能少
36            System.Console.ReadLine();
37            return 0;
38        }

39
40    }

41}

42
43


3.建立客戶端程式:

註冊通道

根據URL得到物件代理

使用代理呼叫遠端物件

 1using System;
 2using System.Runtime.Remoting;
 3using System.Runtime.Remoting.Channels;
 4using System.Runtime.Remoting.Channels.Tcp;
 5using System.Runtime.Remoting.Channels.Http;
 6using System.IO;
 7
 8namespace SimpleRemoting 
 9ExpandedBlockStart.gifContractedBlock.gif{
10    public class Client
11ExpandedSubBlockStart.gifContractedSubBlock.gif    {
12        public static void Main(string[] args)
13ExpandedSubBlockStart.gifContractedSubBlock.gif        {
14ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////使用TCP通道得到遠端物件
15            TcpChannel chan1 = new TcpChannel();
16            ChannelServices.RegisterChannel(chan1);
17
18            HelloServer obj1 = (HelloServer)Activator.GetObject(
19                typeof(SimpleRemoting.HelloServer),
20                "tcp://localhost:8085/SayHello");
21
22            if (obj1 == null)
23ExpandedSubBlockStart.gifContractedSubBlock.gif            {
24                System.Console.WriteLine(
25                    "連線TCP伺服器失敗");
26            }

27
28ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////使用HTTP通道得到遠端物件
29            HttpChannel chan2 = new HttpChannel();
30            ChannelServices.RegisterChannel(chan2);
31
32            HelloServer obj2 = (HelloServer)Activator.GetObject(
33                typeof(SimpleRemoting.HelloServer),
34                "http://localhost:8086/SayHello");
35
36            if (obj2 == null)
37ExpandedSubBlockStart.gifContractedSubBlock.gif            {
38                System.Console.WriteLine(
39                    "連線HTTP伺服器失敗");
40            }

41            
42ExpandedSubBlockStart.gifContractedSubBlock.gif            /**////輸出資訊
43            Console.WriteLine(
44                "ClientTCP HelloMethod {0}",
45                obj1.HelloMethod("Caveman1"));
46            Console.WriteLine(
47                "ClientHTTP HelloMethod {0}",
48                obj2.HelloMethod("Caveman2"));
49            Console.ReadLine();
50        }

51    }

52}

53


結束語:初識用.NET Remoting來開發分散式應用就到這裡了,有時間我會就.NET Remoting技術寫成系列文章。包括基於租約的生存期,編組,非同步遠端呼叫等等。

相關文章