一..NET Remoting簡介:html
.NET Remoting從某種意義上講是DCOM的替代品。ASP.NET Web服務十分有用,可是這項技術在企業內聯網的解決方案中,對於某些業務請求來講並不快,也沒有足夠的靈活性,並且,ASP.NET Web服務須要有運行時的支持。使用.NET Remoting技術後,能夠將Web服務提供給世界上的任何地方。並且能夠在全部的應用程序類型中運行Web服務。數組
二..NET Remoting 的基本原理:服務器
體系結構圖以下:異步
三.幾個重要的概念:tcp
1.遠程對象:分佈式
遠程對象類是從MarshalByRefObject類中派生的。跨越應用程序域調用這個類須要使用代理。.NET Remoting支持兩種類型的遠程對象:知名的(Well-known)遠程對象和客戶激活(Client-activated)遠程對象。遠程對象其實包括兩層含義:spa
操做遠程對象:對象運行在遠程,客戶段向他發送消息;代理
傳遞遠程對象:將遠程對象拿到本地,或者將本地對象發送過去,對副本進行操做。日誌
2.激活:code
使用new運算符能夠激活遠程對象。還有其它一些方式也能夠激活遠程對象,在之後的隨筆裏面我會介紹。
3.通道:
一個遠程對象使用通道發送和接收消息。服務器選擇一個通道來監聽請求,客戶端選擇通道來和服務器通信。Remoting提供了內置的通道:TCP通道和HTTP通道,咱們也能夠編寫本身的通道。
4.編組:
數組經過應用程序域被傳遞的過程稱爲編組。將變量做爲遠程對象的參數來發送時,這個變量必須被轉換,以便可以經過應用程序域發送該變量。
5.監聽:
使用監聽,可以將某些功能置入到方法調用鏈中。若是調用某個對象的方法,監聽層便可以捕獲調用來轉換方法調用,或是完成某些日誌記錄。.NET Remoting調用鏈的每一部分都是用監聽。
四.開發Remoting三步走:
開發.NET Remoting分三步走,在這裏以一個簡單的例子來講明。
1.建立遠程對象:
繼承System.MarshalByRefObject
using System; using System.Collections; using System.Text; namespace SimpleRemoting { public class HelloServer : MarshalByRefObject { public HelloServer() { ///輸出信息,服務器激活 Console.WriteLine("服務器激活……"); } public String HelloMethod(String name) { Console.WriteLine( "服務器端 : {0}", name); return "這裏是:" + name; } } }
2.建立宿主應用程序:
註冊通道
註冊服務器激活的遠程對象
運行宿主程序
using System; using System.Net; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.Remoting.Channels.Http; namespace SimpleRemoting { public class Server { public static int Main(string [] args) { ///建立Tcp通道 TcpChannel chan1 = new TcpChannel(8085); ///建立Http通道 HttpChannel chan2 = new HttpChannel(8086); ///註冊通道 ChannelServices.RegisterChannel(chan1); ChannelServices.RegisterChannel(chan2); RemotingConfiguration.RegisterWellKnownServiceType ( typeof(HelloServer), "SayHello", WellKnownObjectMode.Singleton ); System.Console.WriteLine("按任意鍵退出!"); ///下面這行不能少 System.Console.ReadLine(); return 0; } } }
3.創建客戶端程序:
註冊通道
根據URL獲得對象代理
使用代理調用遠程對象
using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.Remoting.Channels.Http; using System.IO; namespace SimpleRemoting { public class Client { public static void Main(string[] args) { ///使用TCP通道獲得遠程對象 TcpChannel chan1 = new TcpChannel(); ChannelServices.RegisterChannel(chan1); HelloServer obj1 = (HelloServer)Activator.GetObject( typeof(SimpleRemoting.HelloServer), "tcp://localhost:8085/SayHello"); if (obj1 == null) { System.Console.WriteLine( "鏈接TCP服務器失敗"); } ///使用HTTP通道獲得遠程對象 HttpChannel chan2 = new HttpChannel(); ChannelServices.RegisterChannel(chan2); HelloServer obj2 = (HelloServer)Activator.GetObject( typeof(SimpleRemoting.HelloServer), "http://localhost:8086/SayHello"); if (obj2 == null) { System.Console.WriteLine( "鏈接HTTP服務器失敗"); } ///輸出信息 Console.WriteLine( "ClientTCP HelloMethod {0}", obj1.HelloMethod("Caveman1")); Console.WriteLine( "ClientHTTP HelloMethod {0}", obj2.HelloMethod("Caveman2")); Console.ReadLine(); } } }
結束語:初識用.NET Remoting來開發分佈式應用就到這裏了,有時間我會就.NET Remoting技術寫成系列文章。包括基於租約的生存期,編組,異步遠程調用等等。
出處:http://www.cnblogs.com/Terrylee/archive/2005/11/03/267621.html