初识用.NET Remoting来开发分布式应用

    技术2022-05-11  55

     

    一..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得到对象代理

    使用代理调用远程对象

     

     

    作者: TerryLee 出处: http://terrylee.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

     1 using  System;  2 using  System.Runtime.Remoting;  3 using  System.Runtime.Remoting.Channels;  4 using  System.Runtime.Remoting.Channels.Tcp;  5 using  System.Runtime.Remoting.Channels.Http;  6 using  System.IO;  7  8 namespace  SimpleRemoting   9 {10    public class Client11    {12        public static void Main(string[] args)13        {14            ///使用TCP通道得到远程对象15            TcpChannel chan1 = new TcpChannel();16            ChannelServices.RegisterChannel(chan1);1718            HelloServer obj1 = (HelloServer)Activator.GetObject(19                typeof(SimpleRemoting.HelloServer),20                "tcp://localhost:8085/SayHello");2122            if (obj1 == null)23            {24                System.Console.WriteLine(25                    "连接TCP服务器失败");26            }2728            ///使用HTTP通道得到远程对象29            HttpChannel chan2 = new HttpChannel();30            ChannelServices.RegisterChannel(chan2);3132            HelloServer obj2 = (HelloServer)Activator.GetObject(33                typeof(SimpleRemoting.HelloServer),34                "http://localhost:8086/SayHello");3536            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

     

    .建立客户端程序:

    .创建宿主应用程序:


    最新回复(0)