初識用.NET Remoting來開發分佈式應用
一..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
註冊通道
註冊服務器激活的遠程對象
運行宿主程序
註冊通道
根據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
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
.建立客戶端程序:
.創建宿主應用程序: