.NET Remoting对象激活方式

     1、关于 .NET Remoting 的背景信息

     Remoting使用对象引用来进行客户端和服务器之间的通信。在服务器激活情况下,客户端使用Remoting基础结构(Activator.GetObject) 来检索对现有服务器对象的引用。有了对象的引用后,就可以调用对象的方法,就好像该对象在您的进程中,而没有运行在不同的计算机上。以下基础机制用于实现 该功能:

  • 客户端检索远程类型的实例。

  • Remoting基础结构创建一个充当远程类型的代理对象。

  • 客户端调用该代理的方法。Remoting系统收到调用、将其路由到服务器进程、调用服务器对象,然后将结果返回给客户端代理,客户端代理再将结果传递给客户端对象。

     调用本身必须以某种方式在客户端和服务器之间进行发送。Remoting基础结构将该机制称为传输通道。通道在应用程序之间跨越Remoting边界传输消息,无论这种边界 是应用程序域之间、进程之间还是计算机之间的边界。通道可以在端点上侦听入站消息;将出站消息发送到另一个端点,或者同时执行这两个任务。这样,您就可以插入各种协议,即使公共语言运行库不在通道的另一端。

     虽然服务器进程知道关于每个唯一对象的一切信息,但客户端只知道它需要引用另一个应用程序域中的某个对象(可能在另一个计算机上)。从服务器应用程序域之外的范围来看,该对象是通过 URL 定位的。

图1 .NET remoting architecture
 
     1.1 Remoting的通道
 
     Remoting的通道主要有两种:Tcp和Http。在.Net中,System.Runtime.Remoting.Channel中定义了 IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。
 
     TcpChannel类型放在名字空间System.Runtime.Remoting.Channel.Tcp中。Tcp通道提供了基于 Socket的传输工具,使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象,因此它具有更高的传输性能。
 
     HttpChannel类型放在名字空间System.Runtime.Remoting.Channel.Http中。它提供 了一种使用Http协议,使其能在Internet上穿越防火墙传输序列化消息流。默认情况下,HttpChannel类型使用Soap格式序列化消息对 象,因此它具有更好的互操作性。通常在局域网内,我们更多地使用TcpChannel;如果要穿越防火墙,则使用HttpChannel。
 
     1.2 MarshalByRefObject 
 
     MarshalByRefObject 是那些通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。不是从MarshalByRefObject继承的对象会以隐式方式按值封送。当远程应用程序引用一个按值封送的对象时,将跨越Remoting边界传递该对象的副本。因为您希望使用代理方法而不是副本方法进行通信,因此需要继承MarshallByRefObject
 
     1.3 对象激活方式
     
     .NET Framework 支持两种激活模型:服务器激活和客户端激活。 客户端激活对象 (CAO) 和服务器激活对象 (SAO) 之间的主要区别在于,是谁控制着远程对象的生存期。在使用 CAO 的情况下,客户端控制着生存期;而在使用 SAO 的情况下,服务器控制着生存期。
 

     2、服务器端激活

 
     服务器激活对象是其生存期直接由服务器控制的对象。只有当客户端调用对象的方法时,而不是在客户端调用 new 或 Activator.GetObject() 时,服务器应用程序域才会创建这些对象;这样可以减少只是为了创建实例而发生的网络往返通信。当客户端请求一个服务器激活类型的实例时,只会在客户端应用 程序域中创建一个代理。不过,这还意味着服务器激活类型只允许有默认的构造函数。如果要发布的类型的实例将以需要接受参数的特定构造函数来创建,那么,可 以使用客户端激活。
 
     为了创建服务器激活类型的实例,客户端通常使用 Activator.GetObject().
 
     服务器激活对象有两种激活模式:Singleton 和 SingleCall

     Singleton 类型在任何时刻只能有一个实例。如果实例已存在,则所有客户端请求都由该实例来处理。如果不存在实例,服务器将创建一个实例,并且所有随后的客户端请求都会由该实例来处理。

     SingleCall 类型对于每个客户端请求始终有一个实例。下一个方法调用将由其他服务器实例来处理,即使前一个实例尚未被系统回收。
 
     Server端注册服务方式:
     RemotingConfiguration.RegisterWellKnownServiceType()     
 
     Client段激活方式:
     Activator.GetObject()
          GetObject(Type, String)
 
     3、客户端激活
 
     客户端激活需要将服务器配置为允许使用 new 运算符创建客户端激活对象。为了能够使用new运算符,需要配置应用程序名ApplicationName以及要创建的对象的类型,而不是像服务器端激活一样实际地注册一个示例。
 
     为了能够使用new运算符,并且使Remoting框架创建一个远程对象(与本地对象相反),必须首先将远程对象的类型与服务器配置ApplicationName属性时所指定的 URL 相关联。
 
     为了创建客户端激活类型的实例,客户端通常使用newCreateInstance().这种实现允许在客户端的控制下直接创建远程对象。另外,这种实现还表明,在配置客户端之后,创建对象的操作与使用new运算符在本地创建对象完全相同。不过,它有一个较大的缺点。这就是,您不能使用 SAO 模式中所描述的共享接口方式。这意味着,必须将编译好的对象传递给客户端。
 
     注意:传送经过编译的服务器对象违反了分布式对象的一般原则。另外,由于部署和版本控制问题,也不应该这样做。
 
     为了解决这类问题,可以使用混合法(接口+抽象工厂)和SAO创建对象。这种方式使客户端能够控制对象的生存期,而不必将服务器代码传送到客户端。
 

图2 混合法
 
     注册服务方式:(server端)
     RemotingConfiguration.ApplicationName = "xxxx";
     RemotingConfiguration.RegisterActivatedServiceType()     
     
     Client端激活方式:
      RemotingConfiguration.RegisterActivatedClientType
 
     4、Remoting的优缺点
 
     优点     
分布式对象模型: .NET remoting 为全功能的分布式对象模型提供了运行在客户端和服务器上的完整公共语言运行库语义。
构造参数: 客户端激活实现和混合实现中的对象都考虑到了在创建对象时传递构造函数的参数。
 
     缺点
远程对象: 记住,远程调用比公共语言运行库中的本地调用至少慢1000倍。
无共享程序集: 在 CAO 方式中,不能使用共享程序集方式来处理接口。相反,必须将实现传送到客户端,或使用 SoapSuds 提取元数据。
部署的复杂性
有限的互操作性
更加复杂:相比Web Service。
 
     5、MSDN帮助
     
  使用客户端激活对象通过 .NET Remoting 实现 Broker

     http://msdn.microsoft.com/zh-cn/library/ff650208.aspx

  使用服务器激活对象通过 .NET Remoting 实现 Broker
 
 
 
原文地址:https://www.cnblogs.com/junier/p/2582280.html