謝日星
摘要:.NET Remoting是一種允許對象通過應用程序域與另一對象進行交互的框架,與Socket直接通信以及ASP.NET WEB服務相比有著自身明顯的特點,在一定條件下有著處理事件速度快、開發(fā)難度相對較低的優(yōu)點,本文主要說明了高效應用.NET Remoting實現(xiàn)遠程事件處理的技術方案及關鍵技術,以提高分布式系統(tǒng)的整體性能。
關鍵詞:Remoting;遠程事件處理;消息發(fā)送
1 Remoting基礎
Remoting就是DCOM的一種升級,通過通道(channel)來實現(xiàn)兩個應用程序域之間對象的通信,原理如圖1所示。
Remoting中主要包括HTTP和TCP兩種通道,HTTP通道默認使用SOAP格式序列化消息對象,具有更好的互操作性,而TCP通道則默認采用二進制格式,具有更高的傳輸性能,因此,在局域網內的應用常選擇TCP通道,而在需要穿越防火墻的情況下,則選擇HTTP通道。
01
在Remoting中,遠程對象的激活分為服務器端激活和客戶端激活兩大類,其中服務器端激活又稱為WellKnow方式,因為服務器應用程序在激活對象實例之前會在已公布的URL上發(fā)布對應類型,并為此類型配置一個WellKnow對象。服務器端激活方式中又可以分成SingleTon模式和SingleCall模式兩種,其中SingleTon模式中有狀態(tài)模式,Remoting將為所有客戶端建立同一個對象實例;SingleCall模式是無狀態(tài)模式,Remoting會為每一個客戶端建立一個遠程對象實例。客戶端激活模式則在激活每個對象實例時,為每個客戶端激活的類型給定一個URL。
Remoting傳遞的對象是通過引用的方式實現(xiàn)的,因此所傳遞的遠程對象類必須繼承MarshalByRefObject。MarshalByRefObject是通過使用代理交換消息來跨越應用程序域邊界進行通信的對象的基類。服務器端運行過程中,一般通過注冊通道、注冊遠程對象和注銷通道三個步驟完成工作;而客戶端則主要完成注冊通道和獲得遠程對象兩件事。
2 分布式應用技術
Remoting技術在分布式處理程序中的應用中,通常由遠程對象、服務端、客戶端三部分組成,常用的事件處理形式包括:服務端訂閱客戶端事件、客戶端訂閱服務端事件和客戶端訂閱客戶端事件三種,事件處理的實現(xiàn)是Remoting在分布式應用中的難點。
服務器端訂閱客戶端事件是由客戶端發(fā)送消息,服務端捕捉消息然后處理對應事件??蛻舳擞嗛喎斩耸录?則是由服務端發(fā)送消息,所有客戶端都捕獲消息,激發(fā)事件,形成廣播形式的消息發(fā)送和捕獲方式。客戶端訂閱客戶端事件是某個客戶端發(fā)出消息,其他客戶端捕獲消息,激發(fā)事件。所有事件處理形式中,真正包含事件的都是遠程對象。
在分布式應用中,目前大部分實時數(shù)據(jù)處理系統(tǒng)中,都必須實現(xiàn)服務端訂閱客戶端事件,當客戶端需要向服務端發(fā)送消息,要求服務端處理相關數(shù)據(jù)或事件時,只需要通過已激活遠程對象發(fā)送消息,則服務端將接收到消息,并能自動調用已注冊好的事件處理程序,啟動事件處理流程,再把處理的結束發(fā)送回客戶端,則客戶端與服務端完成一次消息傳遞和事件處理,并且調用服務端完成業(yè)務及數(shù)據(jù)的處理。通過這種方式實現(xiàn)客戶端對服務端功能的調用比簡單地通過套接字進行消息的傳遞要方便很多,并能更好地保證系統(tǒng)質量。
3 服務端訂閱客戶端事件實現(xiàn)
簡單的服務端訂閱客戶端事件的實現(xiàn)并不特別困難,但必須注意,客戶端由于程序代碼可能需要部署到客戶計算機,因此對于關鍵性業(yè)務處理的類的相關代碼不應該被部署到客戶端,才能提高系統(tǒng)的安全性,以防止中間代碼被反編譯而導致關鍵機密被破解。
為保證客戶端與服務端能正常進行通信,必須定義客戶端與服務端之間的接口能統(tǒng)一,因頁設計一個遠程對象的公共接口,此接口僅定義通信接口,而接口中各消息的處理(也就是接口中的方法),只在處理業(yè)務的遠程對象類中實現(xiàn),這些處理業(yè)務的遠程對象類將被設計到獨立的一個程序集中,此程序集被不被引用到客戶端系統(tǒng)中,僅會引用到服務端,以實現(xiàn)業(yè)務的處理,也就是完成對客戶端消息的處理。
遠程對象的公共接口(RemoteICommon.dll):
public delegate void MessageEventHandler(string message);
public interface IBusiness
{
void SendMessage(string message);
}
具體處理傳真業(yè)務的遠程對象類(RemoteObj)程序集中,引用遠程對象公共接口程序集,實現(xiàn)遠程對象類:
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;
}
}
其中遠程對象中的事件類型是公共接口中定義的委托類型,并且實現(xiàn)了接口中的方法,這個方法的實現(xiàn)就是開始啟動客戶端消息處理的地方,而覆蓋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),在激活遠程對象后,通過調用遠程對象的方法,完成向服務端發(fā)送相應的消息,方法為:
IBusiness remotingAgent = (ITraderBusiness)Activator.GetObject(typeof(ITraderBusiness), "http://serverIP:port/remoteURL");
remotingAgent. SendMessage(“發(fā)送的消息內容”);
4 結論
應用Remoting技術實現(xiàn)遠程事件處理比直接應用Socket發(fā)送數(shù)據(jù)的方式,能較大程序的降低開發(fā)技術難度,減少開發(fā)工作量,提高系統(tǒng)穩(wěn)定性;與ASP.NET WEB服務相比,當Remoting應用TCP通道時,系統(tǒng)每秒處理事務的數(shù)量比ASP.NET WEB服務要高,而且Remoting應用HTTP通道時,系統(tǒng)每秒處理事務的數(shù)量則比ASP.NET WEB服務要低很多;綜合各種技術方案的特點,在系統(tǒng)條件滿足時,應優(yōu)先選擇Remoting 在 TCP 上使用二進制序列化方案實現(xiàn)遠程事件處理。
參考文獻
[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.