• λ我爱Aspx >> Asp.Net >> Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触
  • Microsoft .Net Remoting系列专题之三:Remoting事件处理全接触

  • :aspxer  Դ:internet  :2007-5-15 20:46:12  ؼ:.net
  • OK,程序完成,我们来看看这个简陋的传真机:

    客户端:

    嘿嘿,做梦都想放假啊。好的,传真写好了,发送吧!再看看服务端,great,老板已经收到我的请假条传真了!

    二、 客户端订阅服务端事件

    嘿嘿,吃甘蔗要先吃甜的一段,做事情我也喜欢先做容易的。现在,好日子过去了,该吃点苦头了。我们先回忆一下刚才的实现方法,再来思考怎么实现客户端订阅服务端事件?

    在前一节,事件被放到远程对象中,客户端激活对象后,就可以发送消息了。而在服务端,只需要订阅该事件就可以。现在思路应该反过来,由客户端订阅事件,服务端发送消息。就这么简单吗?先不要高兴得太早。我们想一想,发送消息的任务是谁来完成的?是远程对象。而远程对象是什么时候创建的呢?我们仔细思考Remoting的几种激活方式,不管是服务端激活,还是客户端激活,他们的工作原理都是:客户端决定了服务器创建远程对象实例的时机,例如调用了远程对象的方法。而服务端所作的工作则是注册该远程对象。

    回忆这三种激活方式在服务端的代码:

    SingleCall激活方式:

    RemotingConfiguration.RegisterWellKnownServiceType(

    typeof(BroadCastObj),"BroadCastMessage.soap",

    WellKnownObjectMode.Singlecall);

    SingleTon激活方式:

    RemotingConfiguration.RegisterWellKnownServiceType(

    typeof(BroadCastObj),"BroadCastMessage.soap",

    WellKnownObjectMode.Singleton);

    客户端激活方式:

    RemotingConfiguration.ApplicationName = “BroadCastMessage.soap”

    RemotingConfiguration.RegisterActivatedServiceType(typeof(BroadCastObj));

    请注意Register这个词语,它表达的含义就是注册。也就是说,在服务端并没有显示的创建远程对象实例。没有该实例,又如何广播消息呢?

    或许有人会想,在注册远程对象之后,显式实例该对象不就可以了吗?也就是说,在注册后加上这一段代码:

    BroadCastObj obj = new BroadCastObj();

    然而,我们要明白一个事实:就是服务端和客户端是处于两个不同的应用程序域中。因此在Remoting中,客户端获得的远程对象实际是服务端注册对象的代理。如果我们在注册后,人工去创建一个实例,而非Remoting在激活后自动创建的对象,那么客户端获得的对象与服务端人工创建的实例是两个迥然不同的对象。客户端获得的代理对象并没有指向你刚才创建的obj实例。所以obj发送的消息,客户端根本无法捕捉。

    Ҷƪл˵?
  • һƪRemoting服务端和客户端程序该这样模式来写
    һƪMicrosoft .Net Remoting系列专题之一:.Net Remoting基础篇