上次以一个简单例子带我们领略了一下remoting的风采,今天我们逐步熟悉下remoting的基础知识。
首先remoting是以通道来连接两个应用程序域之间来进行通讯的,客户端通过remoting访问通道以获得服务器端远程对象,再通过代理解析为客户端对象。远程对象代码可以运行在服务器上(分为服务器端激活的对象和客户端激活的对象),客户端通过remoting连接服务器,获得该服务对象并通过序列化在客户端运行
在remoting可以同时注册多个通道的,但是必须采用不同的端口号和名称来标示,因为名称是通道的唯一标示符。
一 远程对象
远程对象激活,分为客户端激活和服务器端激活
服务器端激活叫做WellKnow激活,不过很多书翻译成知名对象激活方式,它在一个众所周至的URI上发布这个类型,并且服务器进程回为此类型配置一个WellKnow对象,根据指定的地址和协议以及端口来发布对象。
即 RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTest), "proname", WellKnownObjectMode.Singleton);
也可以是
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteTest), "proname", WellKnownObjectMode. SingleCall);
SingleCall和Singleton是代表两中不同模式,
Singleton即为状态模式,可以理解为所有客户端公用一个对象,当它处于激活状态时,它会同时处理所有客户端请求,而并不关注是否是同一个客户端实例。
SingleCall对象即叫做无状态模式,SingleCall是一种无状态模式。一旦设置为SingleCall模式,则当客户端调用远程对象的方法时,Remoting会为每一个客户端建立一个远程对象实例,至于对象实例的销毁则是由GC自动管理的。其实很象我们平时所经常见到的Session。
客户端激活与WellKnown模式不同,Remoting在激活每个对象实例的时候,会给它会分别指派一个URI给客户端激活类型,一旦获得客户端的请求,将为每一个客户端都建立一个实例引用。另外,SingleCall和客户端激活对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求,就实例化;而SingleCall则是要等到调用对象方法时再创建。其次,SingleCall模式激活的对象是无状态的,对象生命期的管理是由GC管理的,而客户端激活的对象则有状态,其生命周期可自定义。其三,两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端,SingleCall模式是由GetObject()来激活,它调用对象默认的构造函数。而客户端激活模式,则通过CreateInstance()来激活,它可以传递参数,所以可以调用自定义的构造函数来创建实例。
对于客户端激活模式有两种方法:
1) 调用RemotingConfiguration的静态方法RegisterActivatedClientType()。这个方法返回值为Void,它只是将远程对象注册在客户端而已。具体的实例化还需要调用对象类的构造函数。
RemotingConfiguration.RegisterActivatedClientType(
typeof(RemoteTest), "tcp://192.168.168.165:8081/proname ");
RemoteTest serverObj = new RemoteTest();
2) 调用进程Activator的CreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的GetObject()不同的是,它要在客户端调用构造函数,而GetObject()只是获得对象,而创建实例是在服务器端完成的。CreateInstance()方法有很多个重载,我着重说一下其中常用的几个。
《1》 public static object CreateInstance(Type type, object[] args, object[] activationAttributes);
Args[]传递的其实就是构造方法的参数
《2》public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);
《3》 public static ObjectHandle CreateInstance(Type type);
《4》 public static ObjectHandle CreateInstance(Type type,bool nonPulic);
其实在日常使用中,以上只是带领大家了解了下remoting基础知识,在实际应用中,如果传递自定义对象,与元数据的相关性,接口知识的融合,都需要我们好好的融会贯通。
偶希望“我丢出一块砖头,有玉的砸过来吧!”