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

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

ASP.NET Remoting体系结构(五): 如何传送自定义类

如何传送自定义类对象

传送自定义类对象需要具备如下条件,存在向进程外的调用方提供功能的服务器对象,存在对服务器对象进行调用的客户端,并具有一个将调用从一端运送到另一端的传输机制。传送类对象分为按值传送和按引用传送。如果服务器方法的地址是逻辑地址,且可在一个进程中正常工作,但不能在其他客户端进程中正常工作。要解决此问题,客户端可以通过创建对象的完整副本,然后将该副本移动到客户端进程来调用服务器对象,这样在该客户端进程中就可以直接调用该副本的方法。这就是按值编组传送自定义类对象。

然而,许多对象无法或不能复制和移动到其他进程来执行。其情况有以下几种。

具有许多方法的非常大的对象不适合复制到或通过值传递到其他进程。通常,客户端仅需要由服务器对象上的一个或几个方法返回的信息。复制整个服务器对象将是对带宽以及客户端内存和处理时间的浪费,因为这种复制将复制与客户端需求无关的大量内部信息或可执行结构。

许多对象公开公共功能,但是有内部执行的私有数据。复制这些对象会使未经授权的客户端能够查看内部数据,从而造成安全隐患。

某些对象使用的数据无法以任何可理解的方式复制。例如,FileInfo 对象包含一个对操作系统文件的引用,此文件在服务器进程的内存中具有惟一的地址。可以复制这个地址,但它在另一进程中将不会具有任何意义。

在这些情况下,服务器进程应当向客户端进程传递一个对服务器对象的引用,而不是传递该对象的副本。客户端可以使用此引用来调用服务器对象。这些调用不在客户端进程中执行。相反,远程处理系统收集关于调用的所有信息并将其发送到服务器进程,在该进程中,将解释这些信息并查找正确的服务器对象,然后代表客户端对象向该服务器对象发出调用。然后,调用的结果被发送回客户端进程。这就是按引用编组传送自定义类对象。

按引用编组的类对象是继承 System.MarshalByRefObject 的可远程处理的对象。根据已声明的激活类型,当客户端在它自己的应用程序域中创建按引用编组的类对象的实例时,.NET远程处理基础结构在调用方的应用程序域中将创建表示该对象的代理对象,并向调用方返回对此代理的引用。然后,客户端将在此代理上进行调用。远程处理将发送这些调用,将其发送回起始应用程序域,并引发对实际对象的调用。

简言之,按值编组的类在传送中对象是从服务器端复制到客户端,然后在客户端执行。按引用编组的类,在传送中对象是通过代理对象进行通信,然后在服务器端执行。

下面是一个按值编组和按引用编组的例子。

ExeClient类按值编组,代码如下:

[Serializable]

public class ExeClient

{

public ExeClient()

{

}

public void NewMethod()

{

}

}

ExeServer类按引用编组,代码如下:

public class ExeServer:System.MarshalByRefObject

{

public ExeServer()

{

}

public void NewMethod()

{

}

}




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





QQ:154298438
QQ:417480759