一..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
2using System.Collections;
3using System.Text;
4
5namespace SimpleRemoting
6{
7 public class HelloServer : MarshalByRefObject
8 {
9 public HelloServer()
10 {
11 /**////輸出資訊,伺服器啟用
12 Console.WriteLine("伺服器啟用……");
13 }
14 public String HelloMethod(String name)
15 {
16 Console.WriteLine(
17 "伺服器端 : {0}", name);
18 return "這裡是:" + name;
19 }
20 }
21}
2.建立宿主應用程式:
註冊通道
註冊伺服器啟用的遠端物件
執行宿主程式
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
9{
10
11 public class Server
12 {
13 public static int Main(string [] args)
14 {
15
16 /**////建立Tcp通道
17 TcpChannel chan1 = new TcpChannel(8085);
18
19 /**////建立Http通道
20 HttpChannel chan2 = new HttpChannel(8086);
21
22 /**////註冊通道
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("按任意鍵退出!");
35 /**////下面這行不能少
36 System.Console.ReadLine();
37 return 0;
38 }
39
40 }
41}
42
43
3.建立客戶端程式:
註冊通道
根據URL得到物件代理
使用代理呼叫遠端物件
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
9{
10 public class Client
11 {
12 public static void Main(string[] args)
13 {
14 /**////使用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)
23 {
24 System.Console.WriteLine(
25 "連線TCP伺服器失敗");
26 }
27
28 /**////使用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)
37 {
38 System.Console.WriteLine(
39 "連線HTTP伺服器失敗");
40 }
41
42 /**////輸出資訊
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技術寫成系列文章。包括基於租約的生存期,編組,非同步遠端呼叫等等。