问一个关于remoting的问题!关于NET 远程处理对象及.NET 远程处理提供的激活模型!望高手指教!

MH2o 2003-12-31 10:38:12
最近看来关于remoting的相关文章其中看到了关于.NET 远程处理对象的一段介绍如下(msnd上的):
NET 远程处理对象
有三种对象类型在经过配置之后可以用作 .NET 远程对象。可根据应用程序的要求来选择对象的类型。本节详细解释下列对象:

Single Call
Single Call 对象向一个并且仅向一个传入的请求提供服务。Single Call 对象在需要对象做有限数量的工作的方案中很有用。通常不需要 Single Call 对象存储状态信息,并且它们不能保存方法调用之间的状态信息。不过,可以以负载平衡的方式来配置 Single Call 对象。
Singleton 对象
Singleton 对象是那些服务多个客户端并且因此通过存储客户端调用之间的状态信息来共享数据的对象。当需要在客户端之间显式共享数据时,以及当创建和维护对象的系统开销相当大时,这些对象很有用。
Client Activated 对象 (CAO)
Client Activated 对象 (CAO) 是根据来自客户端的请求激活的服务器端对象。这种激活服务器对象的方式与传统的 COM coclass 激活方式十分相似。当客户端使用“new”运算符提交对服务器对象的请求时,会向远程应用程序发送激活请求消息。然后服务器就会创建被请求的类的实例,并且将 ObjRef 返回到调用它的客户端应用程序。然后使用该 ObjRef 在客户端创建一个代理。将在该代理上执行客户端的方法调用。Client Activated 对象可为其特定客户端存储方法调用之间的状态信息,而不跨越不同的客户端对象。每次对“new”的调用都为服务器类型的独立实例返回一个代理。
又看到如下一段介绍:
没有基础框架支持的情况下管理远程对象的生存期常常会很麻烦。.NET 远程处理提供了许多激活模型以供选择。这些模型分为两类:

客户端激活的对象
服务器激活的对象
现小弟有几个问题想问,客户端激活的对象和服务器激活的对象的区别(最好能有例子),能不能对Single Call和Singleton做详细的讲解(他们是不是属于服务器激活的对象呢?最好也能有例子)小弟说的不是很明白望高手给予指教,我的msn:mh2o88@hotmail.com小弟这里先谢了!
...全文
46 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
aaabbb456 2004-03-08
  • 打赏
  • 举报
回复
我觉得 storm97(风暴不再) 讲得相当不错!!!
xinuaile 2004-03-01
  • 打赏
  • 举报
回复
up
sxbyl 2004-01-07
  • 打赏
  • 举报
回复
唉,在CSDN一个好的话题常常没几个人参与讨论,前几天想和大家讨论一下 SingleCall 模式负载均衡、状态保存的话题,也是没人参与,郁闷阿
inethax 2004-01-06
  • 打赏
  • 举报
回复
Mark
storm97 2004-01-06
  • 打赏
  • 举报
回复
我给你解释一下他的那个例子的模型,即为什么需要它所说的那种结构,要实现.NET Remoting激活要完成以下工作:
1.创建你的分布式应用的应用逻辑(也就是我们常说的业务逻辑层,当然你也可以直接理解为服务器提供给我们的可以使用的功能);在那个例子中就是Plouffe_Bellard.dll这个装配件,它里面封装了我们将来会使用的一些应用逻辑或者说是应用功能;所以说Plouffe_Bellard.dll是来完成这个第一步工作的。
2.在服务器端创建传输远程调用消息的通道,也就是打开一个指定的通道,并在服务器上注册这个通信信道,这个通道被用来完成服务器端对象和客户端对象的通信工作,当然通道可以有多种注册方式,简单的我现在举一个注册TCP通道的例子:
int REMOTE_PORT=9002;
TcpServerChannel channel=new TcpServerChannel(REMOTE_PORT);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(您要使用的可远程调用的组件,如TestClass.ClsTest),Your URI,WellKnownObjectMode.SingleCall或是Singleton);
//方法RegisterWellKnownServiceType中各参数的含义大家可以查MSDN了解,我这里就不多说了。
只有完成了这个步骤你这个服务器才会真正提供这个可远程调用的组件,也就是相当于在服务器上发布了这个Web Service,可以理解吧!
在ivt(零下一度(.net版)) 所说的那个例子里面DigitsOfPi.exe肯定就是做第二步这个工作的。
3.好了,有了以上两步,那我们在客户端就可以使用这个可远程调用的组件了,那么怎么使用它呢?当然不能和使用本地的装配件一样采取添加引用->实例化这种途径了,首先,要明白你现在要使用的不是本地一个装配件中某个类的实例,我们要使用远程主机上某个装配件中某个类的实例,所以必须从远程主机上获取对象,要从远程主机上获取对象就要在客户机上创建通信信道,以便使我们能够从这个信道得到远程主机上对象的状况及他的实例,我们的客户端不需要直接和服务器打交道获得远程对象,我们是通过存在与客户端的代理来实现对远程对象的访问的。这中间有一系列复杂得操作过程,但好的是微软已经替我们做好了,我们不需要关心其中的细节。当然,如果有需要您也可以自己用代码来完成这些细节。(我就不一一介绍了,有兴趣自己看MSDN)到这里您一定会问,什么是客户端的代理?如何使用客户端代理访问远程对象?客户端代理帮助我们完成与服务器通信(其实也不是客户端代理直接于服务器通信,中间还有若干步骤,不过我们可以视而不见:))来得到服务器的远程对象;使用客户代理获得远程对象可创建客户端代理在代码中是一句话如下:
//为了对应我上面的服务器端程序我在客户端同样注册了TCP信道
ChannelServices.RegisterChannel(new TcpClientChannel());
XXX.XXX xxx=(XXX.XXX)Activator.GetObject(typeof(XXX.XXX), "tcp://ServerName":PortNum/URI");
这时候xxx就是您需要得服务器的远程对象;
而Activator.GetObject(typeof(XXX.XXX), "tcp://ServerName":PortNum/URI");就是客户端代理的创建;
好了这就是一个很简单但是很完整的.NET Remoting的模型了,在ivt(零下一度(.net版))所说的那个例子中,完成这部分功能得应该是ServerLoader.exe;
现在应该很明白了吧!!
也就是说客户端一定要有代理才能得到远程对象的实例,否则是无法进行远程调用的通信的而这个代理其实你也可以理解为客户端去得到(请求)一个远程对象的实例的动作。
ivt 2004-01-06
  • 打赏
  • 举报
回复
serverloader程序可以是客户端代理或是服务器端代理,但我觉得这个东西有点麻烦
如果能没有它程序remoting就会像是本地调用一样对吧
ivt 2004-01-06
  • 打赏
  • 举报
回复
TO:storm97(风暴不再) ( ) 信誉:98

你看看这个例子:
http://www.microsoft.com/china/msdn/library/dnhcvs03/html/vs03d1.asp

此解决方案包含运行“Digits of Pi”应用程序所需的三个项目(Client、Server 和 ServerLoader)。
除了client程序和server组件外还有一个serverloader,要调用server组件先要运行serverloader程序才行。

希望你能指点
storm97 2004-01-06
  • 打赏
  • 举报
回复
楼上的,我怎么没见过有中间代理的程序?
我估计你理解错了,他所谓的中间代理程序可能就是指的客户端的代理,这个东西.NET会为你自动配置,当然,为了提高效率,你也可以自己用代码配置。
ivt 2004-01-06
  • 打赏
  • 举报
回复
随便说一下,我在microsoft.com/china见到的remoting的例子,怎么都会有一个中间的
代理程序呀,不管是服务器端激活还是客户端激。
其实实际应用中可不可以不需要这个代理程序呀。因为如果要调用远程组件一定要启用
代理程序。这里不是很麻烦吗,等于在服务器上还要装上一个程序还要控制它。
实际上是不是这样的呀,应该可以像webserver一样可以远程激活吧.......?????????
storm97 2004-01-06
  • 打赏
  • 举报
回复
我给你解释一下什么是服务器段激活对象:
所谓服务器端激活对象就是对象的实体是存在于服务器上,即对于任何客户端对服务器端组件的调用会在服务器创建调用的类的实体对象,而不会在客户机上创建这样一个实体(当然客户端是通过该队相对应的代理来和服务器的远程对象通信)。
和绕口令一样。呵呵。关于SingleCall和Singleton;
他们都属于服务器端激活,但是他们的区别还是非常大的;
主要的区别是:SingleCall他会为每个客户端调用产生一个对象实例,举个例子,假设有可远程调用的类test1,当我们在客户端使用
test1 uCall=(test1 )Activator.GetObject(typeof(test1),"XXXXX");得到对象实体以后我们就可以使用这个实体了,如同使用本地的.NET装配件一样。但是uCall的每一次调用得到的都不是同一个实体,如何理解呢?是这样的,假设这个类有属性property0和property1,方法有method0,method1;当你使用uCall.property0然后又使用uCall.property1这时候记住你现在访问了类test1的两个实体,虽然代码看上去只是一个uCall实体,其实不然,你可以自己试一下,即uCall.property0和uCall.property1这两个连续的调用访问的是不同的实体而不是同一个实体,这就应征了“SingleCall他会为每个客户端调用产生一个对象实例”这句话;当然Singleton我也就不用多说了,如果你需要维持状态的调用,即每个客户端调用访问的都是同一个实体的话就用他-Singleton
以上是个人的愚见,如果有误,还忘大家给与指正。
MH2o 2003-12-31
  • 打赏
  • 举报
回复
没有人知道吗???自己up一下!
MH2o 2003-12-31
  • 打赏
  • 举报
回复
谢谢!我想知道所谓的客户端激活的对象、服务器激活的对象又是什么意思?
elite2018 2003-12-31
  • 打赏
  • 举报
回复
更详细的Remoting资料可以在MSDN中以"remoting"为关键字搜索得到,其中包括很多Guideline, Best Practice以及Sample Code。
elite2018 2003-12-31
  • 打赏
  • 举报
回复
Remoting的对象生存期包括Single-Call, Singlton和Client-Activate三种。其中Single-Call的开销比较大,一般不用于大型的系统。Singleton和Client-Activate的选择取决于程序的框架设计,例如远程对象是无状态的(可以用Singlton)还是有状态的(需要用Client-Activate)。



和直接在客户端程序中访问数据库的做法,Remoting的使用会降低系统以及客户端程序的Performance。尤其当使用HttpChannel的时候,初始化远程对象的引用会比较耗时。此时如果客户端为WinForm,则当创建远程引用的时候需要使用多线程以防止GUI阻塞。
elite2018 2003-12-31
  • 打赏
  • 举报
回复
NET Remoting完全可以适用于各种分布式程序的开发,而且通过使用客户端配置文件以及将Remoting对象host在IIS上,可以使Remoting在代码级别完全透明。程序员只需要new MyClass()即可创建一个远程的引用。而且,在这种配置下,还能够利用.NET Framework的pooling功能。
MH2o 2003-12-31
  • 打赏
  • 举报
回复
谢谢楼上的了!我现在就去看看!不过还是希望有人能给点讲解!
速马 2003-12-31
  • 打赏
  • 举报
回复
C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Samples\Technologies\Remoting

这里有不少例子
八爪鱼-杭州 2003-12-31
  • 打赏
  • 举报
回复
偶不懂,想了解,帮你顶

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧