当前位置:编程学习 > asp >>

.Net Remoting与WCF实现Server与Client通讯比较

 

.Net Remoting是微软早前推出的一项分布式通讯技术框架,在.Net架构的程序中有着比较广泛的应用。在WCF中,已经集成了Remoting的技术。不过,他们有着很多相同的概念,如:信道(Channel)、代理(Proxy)、寄宿(host)等。在如今仍有一些分布式系统应用中运行着由Remoting技术构建的系统。本文将描述在服务端与客户端的交互中,他们各自的实现方式。

 

  1、Remoting的实现。                                                                                          

 

 

  在Remoting中,远程对象是一个重要的概念。服务端通过将它注册到制定的信道中,客户端服务端公布的服务端注册的远程对象的URI,通过代理来使用它。在这种架构下的服务端与客户端要实现相互之间的通讯一般是使用事件的方式进行。

 

  Remoting的通讯模型中分三块,即:1、客户端、2、远程对象、3、寄宿程序(服务端寄宿的应用程序域)。

 

  注:远程对象一般通过继承自MarshalByRefObject,而继承自MarshalByRefObject的对象是不会离开它的应用程序域的。并且为了安全,一般我们都是通过将远程对象实现的接口提供给客户端,而不是远程对象。

 

  一、客户端发送消息到服务端。客户端获取来远程对象的代理,通过使用它的提供的接口以后,通过信道的传输便到了远程对象。远程对象在收到消息后,用事件的方式通过服务端以执行相应的操作。这时,事件是定义在远程对象中的,客户端进行操作以后,服务端可以直接通过订阅远程对象的事件而获取消息。

 

  二、服务端发送消息到客户端。在服务端,由于它是远程对象注册的应用程序域,服务端可以直接使用它。同样,服务端发送消息给客户端,也是通过事件来实现的。与客户端主动发送消息给服务端不同的是,定义在远程对象的事件运行在服务端,无法序列化到客户端。这种情况下,一般我们可以通过一种类似"中介者"的方式来进行操作。

 

  Remoting的程序结构如下图:

\                

 

 

  说明:

 

 Client:为客户端程序。为了可视性,为将他建成一个Winform的项目

 CommandAssembly:为公共程序集。它是客户端与服务端共享的一个类库,它包括远程对象实现的接口定义。

   Host:为服务端程序,即远程对象寄宿的应用程序。同样它是一个Winform的项目

   RemoteObject:为远程对象。

 

 

  首先,看看远程对象实现的接口定义:

 

01 /// <summary> 

 

02 /// 服务端通知客户端时的事件 

 

03 /// </summary> 

 

04 event DataChangeCallBack DataChangeEventHandler; 

 

05  

 

06 /// <summary> 

 

07 /// 服务端促触发事件函数 

 

08 /// </summary> 

 

09 /// <param name="entityName"></param> 

 

10 void ServerSideDataChange(string entityName); 

 

11  

 

12 /// <summary> 

 

13 /// 客户端调用服务端使用的接口函数 

 

14 /// </summary> 

 

15 /// <param name="entityName"></param> 

 

16 void ClientSideDataChange(string entityName);

 

 

 

   其次:远程对象的定义:

 

public class RemoteObject : MarshalByRefObject, IDataChange 

 

    { 

 

        public event DataChangeCallBack DataChangeEventHandler; 

 

  

 

        public event DataChangeCallBack ClientDataChangeEventHandler; 

 

        #region IDataChange 成员 

 

  

 

        public void ServerSideDataChange(string entityName) 

 

        { 

 

            if (DataChangeEventHandler == null) return; 

 

            foreach (Delegate datachange in DataChangeEventHandler.GetInvocationList()) 

 

            { 

 

                DataChangeCallBack temp = datachange as DataChangeCallBack; 

 

                try

 

                {                     

 

                    temp(entityName); 

 

                } 

 

                catch

 

                { 

 

                    DataChangeEventHandler -= temp; 

 

                } 

 

            } 

 

        } 

 

  

 

        public void ClientSideDataChange(string entityName) 

 

        { 

 

            if (ClientDataChangeEventHandler != null) 

 

            { 

 

                ClientDataChangeEventHandler(entityName); 

 

            } 

 

        } 

 

  

 

        #endregion 

 

  

 

        public override object InitializeLifetimeService() 

 

        { 

 

      &n

补充:Web开发 , ASP.Net ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,