.NET Remoting——first things first(3):RemoteObject远程对象

 首先,RemoteObject是一个对象,而不是一个类。按照翻译过来的意思,进一步来讲,这个对象一定是运行在远程的服务器端,而并不是运行在本机的客户端,至于谁来创建或激活这个对象则需要依据当时的应用场景而定,这个对象一般称之为真实对象。(准确来说,服务器端和客户端是一个广义的概念,其实只要是不同进程都是可以实现.NET Remoting,以下不再强调进程,而都将以服务器端和客户端来描述.NET Remoting概念及其应用)当然,在客户端也会有一个用同RemoteObject类创建对象,不过这个对象只是一个运行在服务器端对象的代理或者说是地址引用,只起到为真实对象进行客户端和服务器端相互消息传递的作用。至于那个用来创建远程对象的类,它可以放在服务器端,也可以放在客户端,甚至放在另外一个地方。
        客户端通过运行在本机的这个代理对象来获得服务器端真正对象所提供的方法,从而获得服务器端提供的服务。反过来说,服务器端通过为运行在各个客户端的代理对象提供真实实现方法从而达到为各个客户端提供服务的目的。
        因此,RemoteObject是整个.NET Remoting的核心。可以说,所有的设计、开发和维护都是围绕着RemoteObject展开的。
在.NET Remoting应用中,为实现客户端使用服务器端的RemotingObject需要做三项工作:
        1. 继承MarshalByRefObject基类
        MarshalByRefObject 是通过使用代理交换消息来跨应用程序域边界进行通信的对象的基类。不是从 MarshalByRefObject 继承的对象根据值隐式封送。当远程应用程序引用根据值封送的对象时,将跨应用程序域边界传递该对象的副本。
所以,RemoteObject只需继承这个基类就可以。这时,这个RemoteObject就可以跨应用程序域边界进行通信,即客户端与服务器端进行通信。
        代码实例:
         public class Calculator : MarshalByRefObject
        {
        }
        2. 注册RemoteObject对象类型
        RemoteObject是运行在服务器端的一个对象,虽然远程的客户端可以通过注册信道,获得服务器端的URL和端口。但是,服务器端的操作系统,或者准确的说.NET Framework并不知道RemoteObject是什么类型?存放在哪里?最终,造成客户端还是无法直接调用这个对象。所以,服务器端必须将这个对象“发布”出去,给这个对象一个URI。
        代码实例:
        //采用服务器激活模式的WellKnow类型中Singleton注册RemoteOjbect
        RemotingConfiguration.RegisterWellKnownServiceType(typeof(Calculator),
                "CalculatorService", WellKnownObjectMode.Singleton);
        注册RemoteObject对象类型的过程,其实告诉了.NET Framework三件事:
        *对象类型
        在完成向.NET Framework注册之后,RemoteObject的创建、管理和销毁都将托管给.NET Framework。因此,.NET Remoting必须要告诉.NET Framework,将被客户端调用的RemoteObject是什么类型?
        *URI(统一资源标识)
        虽然向.NET Framework注册了RemotingObject,但是在服务器端上可能同时运行多个RemoteOjbect。因此,为了区别各个远程对象,.NET Remoting必须为每个RemoteOjbect指定一个地址。这个地址通常被称为URI。当客户端调用RemoteObject时,.NET Framework从消息解析出信道和URI信息,从而找到客户端真正需要的RemoteObject。
        *激活模式
        在.NET Remoting注册RemoteObject时,并没有马上创建对象实例。对象一般都会在客户端调用时,才会由.NET Framework实例化。在实例化后,才开始为客户端提供服务。
.NET Remoting根据应用场景需求不同,分别提供了两种实例化方式,即激活模式。激活模式分别为:
        1) 服务器激活模式
        若.NET Remoting将RemoteObject注册为服务器激活模式后,客户端在调用时,也必须在客户端注册这个RemoteObject。原因很简单,通信是双向的,而不是单向的,客户端知道服务器端的RemoteObject调用地址,自然服务器端也需要知道客户端那个RemoteOjbect代理对象的调用地址。按照状态管理的不同,服务器激活模式可分为如下两种:
        --在服务器端运行期间只由一个对象为一个客户端或多个客户端提供服务,并希望这个对象能一直运行在服务器端。同时,客户端还想知道这个对象运行状态信息。这时,需选择WellKnown类型中的Singleton。
        --在服务器运行期间,为每个客户端生成一个对象,并且RemotingObject在客户端上被调用完后,服务器端立马销毁这个对象,以减少服务器开销。这时,需选择WellKnown类型中的SingleCall。
        2) 客户端激活模式
        客户端激活模式事先并不需要.NET Framework告诉RemoteObject的URI,这也是客户端激活模式与服务器端激活模式最大的区别。另外,客户端激活模式综合了两种服务器激活模式的特点。客户端激活模式即可以为每个客户提供单独RemoteObject实例化对象,而且可以由客户端自身维护这个对象的状态。
        3. 激活RemoteObject对象
        若客户端需要调用RemoteObject时,只需激活RemoteObject对象。在激活后,就可以象使用本地对象一样使用,并不需要关心这个对象在本机运行还是在服务器端运行。
代码实例:
        //客户端激活服务器激活模式的已知类型对象(注册在.NET Framework的RemoteOjbect对于服务器端和客户端来说都是随时使用,相对注册前的RemoteObject自然就是已知类型对象)
        Calculator calculator = (Calculator)Activator.GetObject(
                typeof(Calculator), "tcp://localhost:8891/CalculatorService");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值