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

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

ASP.NET Remoting体系结构(一):远程类对象

远程类对象

任何远程处理框架的主要目的之一就是要提供必要的基础结构,以便隐藏远程对象调用方法和返回结果的复杂性。任何位于调用方应用程序域之外的对象,即使在同一台计算机上执行,也会被认为是远程对象。在应用程序域内部,原始数据类型按数值传递,而所有的对象按引用传递。因为本地对象引用仅在创建对象的应用程序域内有效,所以它们不能以这种方式传递到远程方法调用或从远程方法调用返回。所有必须跨越应用程序域的本地对象都必须按数值来传递,并且应该用 [serializable] 自定义属性作标记,否则它们必须实现 ISerializable 接口。对象作为参数传递时,框架将该对象序列化并传输到目标应用程序域,对象将在该目标应用程序域中被重新构造。无法序列化的本地对象将不能传递到其他应用程序域中,因而也不能远程处理。

如果要构建一个远程类对象则必须继承MarshalByRefObject类,这样可以使任一对象变为远程对象。当某个客户端激活一个远程对象时,它将接收到该远程对象的代理,并对该代理的所有操作适当地重新定向,使远程处理基础结构能够正确截取和转发调用。尽管这种重新定向对性能有一些影响,但JIT编译器和执行引擎(EE)已经优化,可以在代理和远程对象驻留在同一个应用程序域中时,防止不必要的性能损失。如果代理和远程对象不在同一个应用程序域中,则堆栈中的所有方法调用参数会被转换为消息并被传输到远程应用程序域,消息被传输到远程应用程序域后会被转换为原来的堆栈帧,同时该方法也会被调用。从方法调用中返回结果时也使用同一个过程。Remoting体系结构中远程类对象和代理对象就是通过这种方式来通信的。

代理对象是在客户端激活远程对象时创建的。作为远程对象的代表,代理对象确保对代理进行的所有调用都能够转发到正确的远程对象实例。当某个客户端激活一个远程对象时,框架将创建TransparentProxy类的一个本地实例(该类中包含所有类的列表与远程对象的接口方法)。因为TransparentProxy类在创建时用CLR注册,所以代理对象的所有方法调用都在被运行时截取。这时系统将检查调用,以确定该调用是否为远程对象的有效调用,以及远程对象的实例是否与代理位于同一应用程序域中。如果对象在同一个应用程序域中,则被路由到实际对象;如果对象位于不同的应用程序域中,将通过调用堆栈中的调用参数的Invoke方法将其打包到IMessage对象并转发到RealProxy类中。此类(或其内部实现)负责向远程对象转发消息。TransparentProxy类和RealProxy类都是在远程对象被激活后在后台创建的,但只有Transparent Proxy类返回到客户端,以回应客户端的调用,从而实现远程调用类对象。




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





QQ:154298438
QQ:417480759