服务器激活
本主题介绍一项传统技术,保留该技术是为了向后兼容现有的应用程序,不建议对新的开发使用该技术。现在应该使用 Windows Communication Foundation (WCF) 来开发分布式应用程序。
服务器激活的对象是其生存期受服务器直接控制的对象。仅当客户端对对象进行方法调用时,服务器应用程序域才会创建这些对象,而不是当客户端调用 new(在 Visual Basic 中为 New())或 Activator.GetObject 的时候;这会仅为创建实例而保存网络往返行程。客户端请求服务器激活类型的实例时,仅在客户端应用程序域中创建一个代理。这意味着服务器激活类型只允许使用默认构造函数。若要发布将使用特定的采用参数的构造函数创建其实例的类型,您可以使用客户端激活,也可以动态发布您的特定实例。
服务器激活模式
服务器激活的对象有两种激活模式(或 WellKnownObjectMode 值):Singleton 和 SingleCall。
Singleton 类型在任一时刻只有一个实例。如果存在一个实例,所有客户端请求都将由该实例提供服务。如果不存在实例,服务器将创建一个实例,并且所有后续的客户端请求都将由该实例提供服务。由于 Singleton 类型有关联的默认生存期,因此客户端将不会总是接收到对可远程处理的类的同一个实例的引用,即使在任一时刻只有一个实例可用也是如此。
SingleCall 类型始终针对每个客户端请求有一个实例。下一个方法调用将由其他服务器实例提供服务,即使系统尚未回收前一个实例也是如此。SingleCall 类型不参与生存期租约系统。
若要创建服务器激活类型的实例,客户端要么以编程方式配置其应用程序,要么使用配置文件。以编程方式配置应用程序时,您将使用 Activator.GetObject 方法在客户端上实例化服务器激活的对象。使用配置文件配置应用程序时,您可以调用 Activator.GetObject 或者使用 new 运算符在客户端上实例化服务器激活的对象。
注意: |
---|
您可能不需要在客户端注册信道。如果客户端不注册信道,远程处理系统会使用在 Machine.config 文件中指定的默认信道之一自动创建一个信道,以便发送传出的请求。客户端上的这种自动信道选择不会注册信道以侦听来自服务器的任何回调函数,而且除非将该自定义信道添加到 machine.config 文件中,否则它不注册任何自定义的信道实现。在这些情况下,您必须注册您希望在客户端应用程序域中使用的信道类型。 |
下面的代码示例演示对 Activator.GetObject 的调用,假定已经注册了 TcpChannel 以便在端口 8080 上通信。如果您的客户端只知道服务器对象实现了特定的接口,那么您必须使用对 Activator.GetObject 的调用,因为您只能使用 new(在 Visual Basic 中为 New)来创建类的实例。
Dim MyRemoteClass As RemoteObjectClass = _
CType( _
Activator.GetObject(GetType(RemoteObjectClass), _
"tcp://computername:8080/RemoteObjectUri" ), _
RemoteObjectClass
)
RemoteObjectClass MyRemoteClass = (RemoteObjectClass)Activator.GetObject(
typeof(RemoteObjectClass),
"tcp://computername:8080/RemoteObjectUri "
);
请记住,此时还没有发生与服务器之间的实际通信,因此远程对象本身还没有被实例化。已经实例化的是客户端上的代理对象。现在客户端可以像 MyRemoteClass
是对远程对象的直接引用一样使用它了。从方法调用到方法调用,客户端实际用来与之通信的 RemoteObjectClass 实例取决于服务器对象是作为 Singleton 还是 SingleCall 类型被声明的。不管服务器对象的发行者是否公开此信息,客户端都将同等对待它所拥有的对象引用。
Singleton
在 COM 中,“singleton”意味着只要客户端引用您的对象,就不能从内存中删除该对象。但是,在 .NET 远程处理中,Singleton 对象受到为它指定的生存期租约的约束,因此即使当前客户端保留对它的引用,也可以回收它。您可以通过重写 MarshalByRefObject 的 InitializeLifetimeService 方法,以返回一个空引用(在 Visual Basic 中是 Nothing)来创建前一种类型的 Singleton 对象。只要宿主应用程序域在运行,这种方法就可以有效地将对象保存在内存中。有关详细信息,请参见生存期租约。您可以通过在远程处理配置文件中配置初始租约时间来创建后一种类型的 Singleton 对象。
另请参见
参考
WellKnownObjectMode Enumeration