AppDomain:是程序集的容器,一个进程中可包含多个AppDomain,一个AppDomain可以存在多个程序集。
.NET Remoting:
是.NET平台上允许存在于不同AppDomain中的对象可以相互通信的基础设施,调用对象被称为客户端,被调用对象称为服务器端。
两个不同的AppDomain可能存在于:同一进程;同一机器上的两个不同进程;不同机器上的两个不同进程;
在.NET Remoting中,每个通信协议都封装成了一个信道对象,.NET Framework实现了封装HTTP、TCP以及用于同一机器上的进程通信协议(IPC)的信道,当客户端与服务器端对象处在同一AppDomain中或同一进程时,是不需要使用信道的,这种情况.NET Remoting能够自动识别。在调用远程对象方法时,所需的数据主要包含输入、输出参数等,数据以二进制或名为SOAP的XML格式在网络中传输。
对象的激活:
1>:well_known激活:
当对象是由服务器端激活时,客户端的AppDomain中仅存有对象的副本,这代表客户端不需要调用远程对象的类的构造函数,而且客户端必须能够装载包含远程对象的类的程序集,使用该方式,最好把远程对象的类所支持的接口定义在一个专门的程序集中,客户端只需使用该接口来调用远程对象。激活的模式分为single_call(单调用)模式和singleton(单例)模式,单调用模式服务器会为客户端的每次调用激活一个对象,单例模式是所有的客户端共享同一个对象,无论是单调用还是单例,都是在客户端第一次调用服务器对象时,服务器才会激活对象。
2>:客户端激活:
客户端想要激活远程对象,必须知晓对象的类,这表示,客户端的程序集中需要引用包含远程对象的类的程序集。通过该方式激活,客户端的AppDomain中需要获取一个名为透明代理的新对象,也就是使用 Activator.CreateInstance方法创建了一个远程对象的引用。
注:对激活的理解,我们可以说是由服务器提供对象激活服务,而客户端拥有一个指向远程服务器对象激活服务的引用。在客户端激活对象时,我们注意到,客户端的程序集需要引用包含远程对象的类的程序集,而服务器端激活而避免了该做法,因为客户端只需知晓将与它交互的接口即可,但是,如果服务器端的对象不支持接口,我们就不得不在客户端的程序集的引用中包含这个类的程序集,这种做法并不理想,因为这个类的实现要尽可能的保密,解决这个问题有两个方法,Factory设计模式或者soapsuds.exe工具,这里并不做详细介绍。
对象的生命周期:
CLR让每个AppDomain包含一个租约管理器,来解决那些可供位于AppDomain以外的实体访问的对象,租约管理器在每个以远程方式使用的按引用封送的对象被激活时为其分配生存期,租约管理器会周期性的检查这些对象中每个对象的租约,过期的租约对象会在下次垃圾回收时自动销毁,System.Runtime.Remoting.Lifetime命名空间中的ILease和ISponsor两个接口是用来管理该机制的。
配置.NET Remoting:
以上介绍的对象激活机制,一旦编译好了,我们就不能改变端口号等信息,下面演示在XML文档中配置这些参数,方便我们读取与修改。
配置宿主:
配置客户端: