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

  • :aspxer  Դ:internet  :2007-5-15 20:46:12  ؼ:.net
  • 那么,我们只有望洋兴叹,束手无策了吗?别着急,别忘了在服务器注册对象方法中,还有一种方法,即Marshal方法啊。还记得Marshal的实现方式吗?

    BroadCastObj Obj = new BroadCastObj();

    ObjRef objRef = RemotingServices.Marshal(Obj,"BroadCastMessage.soap");

    这个方法与前不一样。前面的三种方式,远程对象是根据客户端调用的方式,来自动创建的。而Marshal方法呢?则显式地创建了远程对象实例,然后将其Marshal到通道中,形成ObjRef指向对象的代理。只要生命周期没有结束,这个对象就一直存在。而此时客户端获得的对象,正是创建的Obj实例的代理。

    OK,这个问题解决了,我们来看看具体实现。

    公共程序集和远程对象与前相似,就不再赘述,只附上代码:

    公共程序集:

    public delegate void BroadCastEventHandler(string info);

    public interface IBroadCast

    {

    event BroadCastEventHandler BroadCastEvent;

    void BroadCastingInfo(string info);

    }

    远程对象类:

    public event BroadCastEventHandler BroadCastEvent;

    #region IBroadCast 成员

    //[OneWay]

    public void BroadCastingInfo(string info)

    {

    if (BroadCastEvent != null)

    {

    BroadCastEvent(info);

    }

    }

    #endregion

    public override object InitializeLifetimeService()

    {

    return null;

    }

    下面,该实现服务端了。在实现之前,我还想罗嗦几句。在第一节中,我们实现了服务端订阅客户端事件。由于订阅事件是在服务端发生的,因此事件本身并未被传送。被序列化的仅仅是传递的消息,即Fax而已。现在,方向发生了改变,传送消息的是服务端,客户端订阅了事件。但这个事件是放在远程对象中的,因此事件必须被序列化。而在.net Framework1.1中,微软对序列化的安全级别进行了限制。有关委托和事件的序列化、反序列化默认是禁止的,所以我们应该将TypeFilterLevel的属性值设置为Full枚举值。因此在服务端注册通道的方式就发生了改变:

    private void StartServer()

    {

    BinaryServerFormatterSinkProvider servERProvider = new

    BinaryServerFormatterSinkProvider();

    BinaryClientFormatterSinkProvider clientProvider = new

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