在生成远程对象时,创建和初始化新对象就是激活。远程处理系统须始终了解所需的激活类型才能将对象设置为可供客户端使用。激活有两种方式:服务器激活和客户端激活

服务器激活

服务器激活的对象是生存期直接受服务器直接控制的对象。仅当客户端对对象进行方法调用时,服务器应用程序域才会创建这些对象,而不是当客户端调用new或Activator.GetObject的时候。客户端请求服务器激活类型的实例时,会在客户端应用程序域中创建一个代理。服务器激活类型只允许使用默认构造器。如果想使用特定的采用参数的构造器创建实例的类型,可以使用客户端激活,也可以动态发布特定实例。

服务器激活的对象有两种激活模式:SingletonSingleCall,这两种模式又叫已知对象,由枚举类型:WellKnownObjectMode来标识。

Singleton类型在任一时刻只有一个实例。所有的客户端请求都将由这个实例提供服务。如果不存在实例,则服务器创建一个,且所有的后来的客户端请求都将由这个实例提供服务。对于单件类型,会关联到默认的生存期。

SingleCall类型针对每个客户端请求创建一个实例。下一个方法调用将由其他服务器实例提供服务,即使在系统尚未回收前一个实例的引用的情况下也是这样。

类RemotingConfiguration

方法 RegisterWellKnownServiceType 将服务器上的对象类型注册为已知类型

public static void RegisterWellKnownServiceType(

Type type,

string objectUri,

WellKnownObjectMode mode)

所有知道已注册已知对象的URI的客户都可以获取该对象的代理,方法是:用ChannelServices注册信道,然后调用new或Activator.GetObject方法来激活对象。

·当用new来激活对象时,须先要使用RegisterWellKnownClientType方法在客户端注册该已知对象类型。调用RegisterWellKonwnClientType方法向远程处理基础结构提供远程对象的位置,使new关键字可以创建它。

·当用Activator.GetObject方法来激活已知对象时,须将对象的URL作为参数提供给该方法,所以在这种情况下,不用预先在客户端注册。

当调用到达服务器后,系统从消息中提取URI,检查远程处理表以定位与该URI匹配的对象的引用,然后实例化该对象,将方法调用转发给该对象。如果是SingleCall,则在方法调用完成后,该对象被销毁。为每个方法创建对象的一个新实例。

Activator.GetObject与new的区别是:Activator.GetObject可以指定URL作为参数,new的时候是从配置中获取URL

1)通过Actovator.GetObject方法来获取代理

Activator类位于System下。它包含一些方法,用于在本地或从远程创建对象类型,或获取对现有远程对象的引用。其中GetObject这个方法有2个重载,方法的意义是:为已知对象或 XML Web services 创建一个代理。

GetObject(Type, String)  为指定类型和 URL 所指示的已知对象创建一个代理。

GetObject(Type, String, Object)  为指定类型、URL 和通道数据所指示的已知对象创建一个代理。

以第一个2个参数的方法为例子:第一个参数Type,是在服务端注册为已知类型的类型,第二个参数是已知对象的URL

服务端:

HttpChannel _channel = new HttpChannel(10001);

ChannelServices.RegisterChannel(_channel,false);

Console.WriteLine("http 通道remoting服务开始……");

RemotingConfiguration.RegisterWellKnownServiceType(

typeof(selfRemoteObject), "selfRemoteObject",

WellKnownObjectMode.Singleton);

客户端:

public void TestService()

{

selfRemoteObject app =

(selfRemoteObject)Activator.GetObject(

typeof(selfRemoteObject),

"http://localhost:10001/selfRemoteObject");

Assert.AreEqual(13,app.Plus(3, 10));

}

2)通过new来创建代理

当用new来激活对象时,先要使用RegisterWellKnownClientType方法在客户端注册该已知对象类型。然后使new关键字可以创建它。

服务端还是(1)中的服务端

客户端:

public void TestServiceNew()

{

RemotingConfiguration.RegisterWellKnownClientType(

typeof(selfRemoteObject),

"http://localhost:10001/selfRemoteObject");

selfRemoteObject app = new selfRemoteObject();

Assert.AreEqual(13, app.Plus(3, 10));

}

以上两种方法在创建代理后,调用方法时,服务端会管理已知类型对象的创建工作,这种生成对象是按默认的构造器(无参)来进行。

客户端激活

客户端激活的对象由调用应用程序域控制其生存期的对象,这种情况与应用程序域控制本地对象生存期一样。

创建客户端激活对象时,客户端将调用服务器。服务器实例化远程对象,并将对象引用返回给客户端。客户端使用这个引用创建远程对象的代理。每当客户端创建客户端激活对象的实例时,都会收到与远程对象的特定服务器实例进行通信的代理,直至其租约过期,内存被回收为止。

采用客户端激活方式的步骤:

·要在服务器上创建客户端激活的对象的实例,要知道它的Type

·使用RegisterActivatedServiceType方法在服务端注册它。

客户端步骤:

·客户端先向ChannelServices注册一个通道,

·通过调用new或Activator.CreateInstance激活对象。

创建客户端激活类型实例的两种方式:

·以new来进行

·以Activator.CreateInstance的调用中传递远程对象

先准备服务端:

HttpChannel _channel = new HttpChannel(10001);

ChannelServices.RegisterChannel(_channel,false);

Console.WriteLine("http 通道remoting服务开始……");

RemotingConfiguration.ApplicationName = "selfRemoteObject";

RemotingConfiguration.RegisterActivatedServiceType

(typeof(selfRemoteObject));

Console.Read();

服务端要通过RegisterActivatedServiceType方法来注册类型,且先要设定ApplicationName,这个就相当于URL

客户端

1)以new来进行

public void TestClientNew()

{

HttpChannel _channel = new HttpChannel();

ChannelServices.RegisterChannel(_channel, false);

RemotingConfiguration.RegisterActivatedClientType

(

typeof(selfRemoteObject),

"http://localhost:10001/selfRemoteObject");

selfRemoteObject app1 = new selfRemoteObject();

Assert.AreEqual(10, app1.Plus(1, 9));

}

通过new来激活客户端对象类型,先使用RegisterActivatedClientType方法在客户端注册该对象类型,然后new就可以了。

2Activator.CreateInstance

如果用CreateInstance,则要提供远程应用程序的URL作为参数,不用在客户端注册类型。如果要用到URL做参数,则URL要封装在UrlAttribute类实例中。

public void TestClientInstance()

{

HttpChannel _channel = new HttpChannel();

ChannelServices.RegisterChannel(_channel,false);

object[] url={new UrlAttribute

("http://localhost:10001/selfRemoteObject")};

selfRemoteObject app1 =

(selfRemoteObject)Activator

.CreateInstance(typeof(selfRemoteObject), null, url);

Assert.AreEqual(10, app1.Plus(1, 9));

}

客户端激活方式可以使用带参构造器来创建远程对象实例。

修改远程对象,添加一属性一个带参构造器:

public int Unid { get; set; }

public selfRemoteObject() { }

public selfRemoteObject(int iUnid)

{

Unid = iUnid;

}

添加了带参构造器,要显示声明默认的无参构造器。

通过new方法来创建对象实例。

selfRemoteObject app1 = new selfRemoteObject();

Assert.AreEqual(0, app1.Unid);

selfRemoteObject app2 = new selfRemoteObject(10);

Assert.AreEqual(10, app2.Unid);

激活方式,是远程对象实例创建的的管理方式。服务器端激活就是由服务端来管理远程对象的创建,在这种方式下,当客户端调用方法时,才创建实例;客户端激活由客户端来管理远程对象的创建,在这种方式下,当客户端发出调用就创建实例。

RemotingConfiguration类的类型注册方法:

RegisterActivatedClientType 将客户端上的对象 Type 注册为可在服务器上激活的类型。

RegisterActivatedServiceType  将服务端上的对象 Type 注册为可根据请求从客户端激活的类型。

RegisterWellKnownClientType  将客户端上的对象 Type 注册为已知类型(“单个调用”(singlecall) 或 singleton)。

RegisterWellKnownServiceType  将服务端上的对象 Type 注册为已知类型(“单个调用”(singlecall) 或 singleton)。

断开

RemotingServices.Disconnect这个方法用于阻止对象通过注册的远程处理信道再接收消息。它的参数须是实例化的对象(要关闭的),服务端注册类型要通过Marshal方法来进行:

HttpChannel _channel = new HttpChannel(10001);

ChannelServices.RegisterChannel(_channel,false);

Console.WriteLine("http 通道remoting服务开始……");

selfRemoteObject obj=new selfRemoteObject();

RemotingServices.Marshal(obj, "selfRemoteObject");

断开时,通过Disconnect方法:

RemotingServices.Disconnect(obj);

转载于:https://www.cnblogs.com/chengcailian/p/3838398.html

.Net----Remoting 激活 激活方式相关推荐

  1. .NET Remoting开发系列:(三) Remoting服务发布方式

    Remoting服务发布方式? 使用应用程序发布 这个在第一篇就已经讲了. 通过Windows服务发布 通过IIS发布 通过Windows服务发布Remoting 首先我们要建立一个WindowsSe ...

  2. Jrebel最新激活破解方式(持续更新) 转

    一.安装JRebel 二.激活 2019-04-01 愚人节最新激活地址 :  http://139.199.89.239:1008/4571ab86-eb0d-4d2b-999e-37406bb8b ...

  3. Jrebel最新激活破解方式

    亲测有效 https://blog.csdn.net/xingbaozhen1210/article/details/81093041

  4. win10用户查看系统激活码方式

    打开命令提示符win+R 输入cmd 输入 wmic path softwarelicensingservice get OA3xOriginalProductKey 回车 出现的那一串就是你的序列号 ...

  5. 总结|pycharm2020 激活激活方法

    1.学生授权申请:传送门 推荐使用!! JetBrains开发工具免费提供学生和教师使用.取得授权后只需要使用相同的 JetBrains 帐号就可以激活其他产品,不需要重复申请. 开始申请前请先到 神 ...

  6. IDEA 2018 ultimate 简单激活方式

    1.下载补丁:https://download.csdn.net/download/liupeifeng3514/10688341 补丁下载后放置在任意的目录中,后边会使用,我放在了这里: 2.然后以 ...

  7. 微软改变零售版Win8激活方式 取消30天宽限期

    最新消息微软已经在零售版Windows 8中取消了30天的宽限期,规定用户在安装Windows 8的时候提供产品密钥. 这个改变与微软以前的做法完全不同.例如,使用Windows 7,用户在提供合法密 ...

  8. WCF服务实例激活类型编程与开发(转)

    [引言]: 在WCF分布式开发必备知识(2):.Net Remoting这 篇文章里我已经介绍过了Net Remoting相关的概念,其中也包括Net Remoting的激活方式:SingleTon模 ...

  9. 安装jrebel热部署插件,并激活

    支持jrebel7.x版本 最新版没找到破解方式,使用7版本 激活软件和jrebel安装包下载 激活工具源代码:https://gitee.com/gsls200808/JrebelLicenseSe ...

  10. Pycharm2018的激活方法或破解方法

    1.授权服务器激活 优点:方便快捷 缺点:激活的人数多了就容易被封杀,所以可能经常需要去激活 选择License server激活,然后填入: idea.qmanga.com或http://xidea ...

最新文章

  1. 腾讯AI Lab刷新人脸检测与识别两大测评国际记录,技术日调用超六亿
  2. 沃尔玛拟投入两千多万元加强食品安全自检
  3. 8-14-Exercise
  4. OpenCV-Python教程(4、形态学处理)
  5. 云栖大会极客智造局亮点抢先看
  6. asp.net 跨页面传值(一)
  7. 通过 .NET Framework 中的 XPath 和 XSLT API 方便地操作 XML 数据
  8. ubuntu16.04 + kinetic +turtlebot2配置
  9. Hive 基础及安装
  10. 保护计算机系统与数据有什么方法,电脑数据保护方法 看完保你不后悔
  11. 房产中介管理系统网站完整源码
  12. 用opencv将左右眼视角图片转换为红蓝3D图片
  13. “多事之秋”的趣店,如今还好吗?
  14. 小白扫盲:浅谈web应用在nat123下的vip服务
  15. snabbdom源码粗读
  16. 《微机原理与接口技术(第三版)》的专有名词缩写你还在死记硬背???【更新至第二章 ARM微处理器
  17. 武汉理工计算机考研852,武汉理工852经验帖
  18. --whole-archive 和 --no-whole-archive的区别
  19. api平台支持的格式
  20. 【Keras-ResNet】CIFAR-10

热门文章

  1. android 如何正确使用 泛型 和 多参数 “偷懒”
  2. Oracle study之--HASH Cluster特点
  3. Sniffer安全技术从入门到精通
  4. 页面动态加载android,Android APP启动页面动态加载全部权限
  5. Nginx源码分析 - 核心模块初始化顺序,根据ctx创建上下文
  6. Nginx源码分析 - 主流程篇 - 平滑重启和信号控制(10)
  7. Prototype使用Template
  8. 【渝粤教育】国家开放大学2018年春季 8662-22T特色课(1) 参考试题
  9. 【渝粤教育】电大中专电子商务网站建设与维护 (17)作业 题库
  10. LU分解的矩阵逆运算