1C#REMOTING开发资料

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一..NETRemoting简介:.NETRemoting从某种意义上讲是DCOM的替代品。ASP.NETWeb服务十分有用,但是这项技术在企业内联网的解决方案中,对于某些业务请求来说并不快,也没有足够的灵活性,而且,ASP.NETWeb服务需要有运行时的支持。使用.NETRemoting技术后,可以将Web服务提供给世界上的任何地方。而且可以在所有的应用程序类型中运行Web服务。二..NETRemoting的基本原理:体系结构图如下:三.几个重要的概念:1.远程对象:远程对象类是从MarshalByRefObject类中派生的。跨越应用程序域调用这个类需要使用代理。.NETRemoting支持两种类型的远程对象:知名的(Well-known)远程对象和客户激活(Client-activated)远程对象。远程对象其实包括两层含义:操作远程对象:对象运行在远程,客户段向他发送消息;传递远程对象:将远程对象拿到本地,或者将本地对象发送过去,对副本进行操作。2.激活:使用new运算符可以激活远程对象。还有其它一些方式也可以激活远程对象,在以后的随笔里面我会介绍。3.通道:一个远程对象使用通道发送和接收消息。服务器选择一个通道来监听请求,客户端选择通道来和服务器通讯。Remoting提供了内置的通道:TCP通道和HTTP通道,我们也可以编写自己的通道。4.编组:数组通过应用程序域被传递的过程称为编组。将变量作为远程对象的参数来发送时,这个变量必须被转换,以便能够通过应用程序域发送该变量。5.监听:使用监听,能够将某些功能置入到方法调用链中。如果调用某个对象的方法,监听层便能够捕获调用来转换方法调用,或是完成某些日志记录。.NETRemoting调用链的每一部分都是用监听。四.开发Remoting三步走:开发.NETRemoting分三步走,在这里以一个简单的例子来说明。1.创建远程对象:继承System.MarshalByRefObject1usingSystem;2usingSystem.Collections;3usingSystem.Text;45namespaceSimpleRemoting6{7publicclassHelloServer:MarshalByRefObject8{9publicHelloServer()10{11///输出信息,服务器激活12Console.WriteLine(服务器激活……);13}14publicStringHelloMethod(Stringname)15{16Console.WriteLine(17服务器端:{0},name);18return这里是:+name;19}20}21}2.创建宿主应用程序:注册通道注册服务器激活的远程对象运行宿主程序1usingSystem;2usingSystem.Net;3usingSystem.Runtime.Remoting;4usingSystem.Runtime.Remoting.Channels;5usingSystem.Runtime.Remoting.Channels.Tcp;6usingSystem.Runtime.Remoting.Channels.Http;78namespaceSimpleRemoting9{1011publicclassServer12{13publicstaticintMain(string[]args)14{1516///创建Tcp通道17TcpChannelchan1=newTcpChannel(8085);1819///创建Http通道20HttpChannelchan2=newHttpChannel(8086);2122///注册通道23ChannelServices.RegisterChannel(chan1);24ChannelServices.RegisterChannel(chan2);2526RemotingConfiguration.RegisterWellKnownServiceType27(28typeof(HelloServer),29SayHello,30WellKnownObjectMode.Singleton31);323334System.Console.WriteLine(按任意键退出!);35///下面这行不能少36System.Console.ReadLine();37return0;38}3940}41}42433.建立客户端程序:注册通道根据URL得到对象代理使用代理调用远程对象1usingSystem;2usingSystem.Runtime.Remoting;3usingSystem.Runtime.Remoting.Channels;4usingSystem.Runtime.Remoting.Channels.Tcp;5usingSystem.Runtime.Remoting.Channels.Http;6usingSystem.IO;78namespaceSimpleRemoting9{10publicclassClient11{12publicstaticvoidMain(string[]args)13{14///使用TCP通道得到远程对象15TcpChannelchan1=newTcpChannel();16ChannelServices.RegisterChannel(chan1);1718HelloServerobj1=(HelloServer)Activator.GetObject(19typeof(SimpleRemoting.HelloServer),20tcp://localhost:8085/SayHello);2122if(obj1==null)23{24System.Console.WriteLine(25连接TCP服务器失败);26}2728///使用HTTP通道得到远程对象29HttpChannelchan2=newHttpChannel();30ChannelServices.RegisterChannel(chan2);3132HelloServerobj2=(HelloServer)Activator.GetObject(33typeof(SimpleRemoting.HelloServer),34);3536if(obj2==null)37{38System.Console.WriteLine(39连接HTTP服务器失败);40}4142///输出信息43Console.WriteLine(44ClientTCPHelloMethod{0},45obj1.HelloMethod(Caveman1));46Console.WriteLine(47ClientHTTPHelloMethod{0},48obj2.HelloMethod(Caveman2));49Console.ReadLine();50}51}52}什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种升级,它改善了很多功能,并极好的融合到.Net平台下。Microsoft?.NETRemoting提供了一种答应对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢?在Windows操作系统中,是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据四周的一道边界。假如不采用进程间通信(RPC)机制,则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下,我们需要跨过应用程序域,与另外的应用程序域进行通信,即穿越边界。在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的。如图所示:首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。这就提供一种可能性,即以服务的方式来发布服务器对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。在Remoting中,对于要传递的对象,设计者除了需要了解通道的类型和端口号之外,无需再了解数据包的格式。但必须注重的是,客户端在获取服务器端对象时,并不是获得实际的服务端对象,而是获得它的引用。这既保证了客户端和服务器端有关对象的松散耦合,同时也优化了通信的性能。1、Remoting的两种通道Remoting的通道主要有两种:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定义了IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。TcpChannel类型放在名字空间System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于Socket的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。HttpChannel类型放在名字空间System.Runtime.Remoting.Channel.Http中。它提供了一种使用Http协议,使其能在Internet上穿越防火墙传输序列化消息流。默认情况下,HttpChannel类型使用Soap格式序列化消息对象,因此它具有更好的互操作性。通常在局域网内,我们更多地使用TcpChannel;假如要穿越防火墙,则使用HttpChannel。2、远程对象的激活方式在访问远程类型的一个对象实例之前,必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象,称为对象的激活。在Remoting中,远程对象的激活分为两大类:服务器端激活和客户端激活。(1)服务器端激活,又叫做WellKnow方式,很多又翻译为知名对象。为什么称为知名对象激活模式呢?是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象,并根据指定的端口或地址来发布对象。.NetRemoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。SingleTon模式:此为有状态模式。假如设置为SingleTon激活方式,则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时,SingleTon实例会处理所有后来的客户端访问请求,而不管它们是同一个客户端,还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说,假如一个远程对象有一个累加方法(i=0;++i),被多个客户端(例如两个)调用。假如设置为SingleTon方式,则第一个客户获得值为1,第二个客户获得值为2,因为他们获得的对象实例是相同的。假如熟悉asp.net的状态治理,我们可以认为它是一种application状态。SingleCall模式:SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动治理的。同上一个例子而言,则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴ASP.Net的状态治理,认为它是一种session状态。(2)客户端激活。与WellKnown模式不同,Remoting在激活每个对象实例的时候,会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是

1 / 111
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功