Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 1:35:37
ASP.NET Remoting体系结构(七)

ASP.NET Remoting体系结构(七): 远程对象的注册和

远程对象的注册和激活

远程处理框架支持远程对象的服务器激活和客户端激活。不需要远程对象在方法调用之间维护任何状态时,一般使用服务器激活。服务器激活也适用于多个客户端调用方法位于同一对象实例上、且对象在函数调用之间维持状态的情况。另一方面,客户端激活对象从客户端实例化,并且客户端通过使用基于租用的专用系统来管理远程对象的生存期。

在可以接受客户端的访问之前,所有的远程对象都必须用远程处理框架注册。对象注册一般由宿主应用程序来完成。宿主应用程序将启动使用ChannelServices类注册一个或多个通道,使用RemotingServices类注册一个或多个远程对象,然后等待被终止。

注意:已注册的通道和对象只有在用来注册它们的进程活动时才可以使用。如果退出了该进程,则会自动从远程处理服务中删除它注册的所有信道和对象。

在框架中注册远程对象时,需要以下4项信息,如下所示。

包含类的程序集名称。

远程对象的类型名称。

客户端定位对象时将使用的对象URI。

服务器激活所需的对象模式。该模式可以是SingleCall,也可以是Singleton。

远程对象可以通过下列两种方式注册,调用RegisterWellKnownType类,将上述信息作为参数传递;或将上述信息存储在配置文件中,然后调用ConfigureRemoting类并将该配置文件的名称作为参数传递。

这两种方法执行的功能相同,因此可以使用其中的任意一种来注册远程对象。当然,后一种方法更方便些,因为无需重新编译宿主应用程序,即可改变配置文件的内容。将HelloService 类注册为 SingleCall 远程对象,代码如下:

RemotingServices.RegisterWellKnownType(

"server",

"Samples.HelloServer",

"SayHello",

WellKnownObjectMode.SingleCall);

其中,server是程序集的名称,HelloServer 是类的名称,SayHello是对象URI。

注册了远程对象后,框架将为该对象创建一个对象引用,然后从程序集中提取与该对象相关的必要元数据。随后,这一信息将与 URI 和程序集名称一起存储在对象引用中(该对象引用将被写入一个用于跟踪已注册远程对象的远程处理框架表中)。这里需要注意,除了在客户端试图调用对象上的某个方法或从客户端激活对象时以外,注册进程不会实例化远程对象自身。

现在,任何知道该对象URI的客户端都可以使用ChannelServices类注册信道,并调用new、GetObject 或 CreateInstance 激活对象,从而获得该对象的一个代理。示例代码如下:

ChannelServices.RegisterChannel(new TCPChannel);

HelloServer obj = (HelloServer)Activator.GetObject(

typeof(Samples.HelloServer), "tcp://localhost:9999/SayHello");

其中tcp://localhost:8085/SayHello表示在端口9999上使用TCP协议连接到SayHello终结点的远程对象。在编译该客户端代码时,编译器会要求提供关于HelloServer 类的类型信息。该信息可以通过以下方式来提供,提供对HelloService类所在程序集的引用将远程对象拆分为实现和接口类,并在编译客户端时引用这些接口。使用SOAPSUDS工具直接从终结点提取所需的元数据。此工具将连接至所提供的终结点,提取元数据,然后生成可用于编译客户端的程序集或源代码。

GetObject或new可用于服务器激活对象。使用这两个调用时不会实例化对象,实际上也不会生成任何网络调用。框架从元数据获得了创建代理所须的足够信息,但并未连接到远程对象上。只有在客户端调用代理上的某个方法时才会建立网络连接。当调用抵达服务器时,框架将从消息中提取 URI,检查远程处理框架表以便定位与 URI 匹配的对象引用,然后在必要时将对象实例化,并将方法调用转发至对象。如果将对象注册为SingleCall(远程对象模式),则完成方法调用后该对象会取消。每次调用一个方法时,都会创建一个新的实例。GetObject 和 new 之间的惟一差别在于,前者允许指定URL作为参数,而后者从配置中获得 URL。


If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759