APP下载

Remoting技术在远程事件处理中的应用

2009-01-05谢日星

软件工程 2009年12期

谢日星

摘要:.NET Remoting是一种允许对象通过应用程序域与另一对象进行交互的框架,与Socket直接通信以及ASP.NET WEB服务相比有着自身明显的特点,在一定条件下有着处理事件速度快、开发难度相对较低的优点,本文主要说明了高效应用.NET Remoting实现远程事件处理的技术方案及关键技术,以提高分布式系统的整体性能。

关键词:Remoting;远程事件处理;消息发送

1 Remoting基础

Remoting就是DCOM的一种升级,通过通道(channel)来实现两个应用程序域之间对象的通信,原理如图1所示。

Remoting中主要包括HTTP和TCP两种通道,HTTP通道默认使用SOAP格式序列化消息对象,具有更好的互操作性,而TCP通道则默认采用二进制格式,具有更高的传输性能,因此,在局域网内的应用常选择TCP通道,而在需要穿越防火墙的情况下,则选择HTTP通道。

01

在Remoting中,远程对象的激活分为服务器端激活和客户端激活两大类,其中服务器端激活又称为WellKnow方式,因为服务器应用程序在激活对象实例之前会在已公布的URL上发布对应类型,并为此类型配置一个WellKnow对象。服务器端激活方式中又可以分成SingleTon模式和SingleCall模式两种,其中SingleTon模式中有状态模式,Remoting将为所有客户端建立同一个对象实例;SingleCall模式是无状态模式,Remoting会为每一个客户端建立一个远程对象实例。客户端激活模式则在激活每个对象实例时,为每个客户端激活的类型给定一个URL。

Remoting传递的对象是通过引用的方式实现的,因此所传递的远程对象类必须继承MarshalByRefObject。MarshalByRefObject是通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。服务器端运行过程中,一般通过注册通道、注册远程对象和注销通道三个步骤完成工作;而客户端则主要完成注册通道和获得远程对象两件事。

2 分布式应用技术

Remoting技术在分布式处理程序中的应用中,通常由远程对象、服务端、客户端三部分组成,常用的事件处理形式包括:服务端订阅客户端事件、客户端订阅服务端事件和客户端订阅客户端事件三种,事件处理的实现是Remoting在分布式应用中的难点。

服务器端订阅客户端事件是由客户端发送消息,服务端捕捉消息然后处理对应事件。客户端订阅服务端事件,则是由服务端发送消息,所有客户端都捕获消息,激发事件,形成广播形式的消息发送和捕获方式。客户端订阅客户端事件是某个客户端发出消息,其他客户端捕获消息,激发事件。所有事件处理形式中,真正包含事件的都是远程对象。

在分布式应用中,目前大部分实时数据处理系统中,都必须实现服务端订阅客户端事件,当客户端需要向服务端发送消息,要求服务端处理相关数据或事件时,只需要通过已激活远程对象发送消息,则服务端将接收到消息,并能自动调用已注册好的事件处理程序,启动事件处理流程,再把处理的结束发送回客户端,则客户端与服务端完成一次消息传递和事件处理,并且调用服务端完成业务及数据的处理。通过这种方式实现客户端对服务端功能的调用比简单地通过套接字进行消息的传递要方便很多,并能更好地保证系统质量。

3 服务端订阅客户端事件实现

简单的服务端订阅客户端事件的实现并不特别困难,但必须注意,客户端由于程序代码可能需要部署到客户计算机,因此对于关键性业务处理的类的相关代码不应该被部署到客户端,才能提高系统的安全性,以防止中间代码被反编译而导致关键机密被破解。

为保证客户端与服务端能正常进行通信,必须定义客户端与服务端之间的接口能统一,因页设计一个远程对象的公共接口,此接口仅定义通信接口,而接口中各消息的处理(也就是接口中的方法),只在处理业务的远程对象类中实现,这些处理业务的远程对象类将被设计到独立的一个程序集中,此程序集被不被引用到客户端系统中,仅会引用到服务端,以实现业务的处理,也就是完成对客户端消息的处理。

远程对象的公共接口(RemoteICommon.dll):

public delegate void MessageEventHandler(string message);

public interface IBusiness

{

void SendMessage(string message);

}

具体处理传真业务的远程对象类(RemoteObj)程序集中,引用远程对象公共接口程序集,实现远程对象类:

public class Business:MarshalByRefObject, IBusiness

{

public static event MessageEventHandler MessageSendedEvent;

public void SendMessage (string message)

{

if (MessageSendedEvent!= null)

{

MessageSendedEvent (fax);

}

}

public override object InitializeLifetimeService()

{

return null;

}

}

其中远程对象中的事件类型是公共接口中定义的委托类型,并且实现了接口中的方法,这个方法的实现就是开始启动客户端消息处理的地方,而覆盖MarshalByRefObject接口中的InitializeLifetimeService,并返回null则可以使远程对象的生命周期为无限大。

在服务端中,引用远程对象类所在的程序集,并且在服务端启动服务过程中注册通道和远程对象,最后再注册事件处理程序,方法为:

BinaryServerFormatterSinkProvider serverProvider = new

BinaryServerFormatterSinkProvider();

BinaryClientFormatterSinkProvider clientProvider = new

BinaryClientFormatterSinkProvider();

serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

IDictionary props = new Hashtable();

props["port"] = 8000;/*端口*/

HttpChannel channel = new HttpChannel(props, clientProvider, serverProvider);

System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(channel);

remotingServer = new Business();

ObjRef objref = RemotingServices.Marshal(remotingServer, remoteURL);

remotingServer. MessageSendedEvent += new Message

EventHandler(OnMessageSended);

客户端仅引用远程对象公共接口程序集(RemoteICommon.dll),在激活远程对象后,通过调用远程对象的方法,完成向服务端发送相应的消息,方法为:

IBusiness remotingAgent = (ITraderBusiness)Activator.GetObject(typeof(ITraderBusiness), "http://serverIP:port/remoteURL");

remotingAgent. SendMessage(“发送的消息内容”);

4 结论

应用Remoting技术实现远程事件处理比直接应用Socket发送数据的方式,能较大程序的降低开发技术难度,减少开发工作量,提高系统稳定性;与ASP.NET WEB服务相比,当Remoting应用TCP通道时,系统每秒处理事务的数量比ASP.NET WEB服务要高,而且Remoting应用HTTP通道时,系统每秒处理事务的数量则比ASP.NET WEB服务要低很多;综合各种技术方案的特点,在系统条件满足时,应优先选择Remoting 在 TCP 上使用二进制序列化方案实现远程事件处理。

参考文献

[1]Ingo Rammer.Advanced .NET Remoting.New York:Springer-Verlag New York Inc.2008.

[2]微软公司.基于C#的.NET Framework程序设计[M].北京:高等教育出版社,2004.

[3]微软公司.组件应用程序设计——COM+应用程序设计[M].北京:高等教育出版社,2004.

[4]微软公司.基于.NET的需求分析和解决方案设计[M].北京:高等教育出版社,2004.

[5]微软公司.基于C#的Windows应用程序设计[M].北京:高等教育出版社,2004.