none
客户端程序意外退出后 服务端如何及时判断客户端已经离线了呢? RRS feed

  • 问题

  • 有时候有些客户端进程意外终止,没有正常退出,会造成服务端的不同步,如何及时让服务器发现客户端已经离线?
    谢谢斑竹和各位


    淡叶到此一游
    2009年10月22日 7:04

答案

  • 那个,客户首次调用的时候。给客户端通道添加一个Faulted事件处理函数就行啊。

    另外一个最保险的办法就是加心跳。

     能否说说具体如何实现?
    谢谢
    淡叶到此一游

    举例,比如你的接口有个GetValue函数。
    在服务端可以这么写:
    void GetValue()
    {
           // 通道异常处理
           OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
          ///.....
    }

    void Channel_Faulted(object sender, EventArgs e)
    {
          // 这里写你的异常处理就行。
          throw new NotImplementedException();
    }

    另外最好也对OnClosed加上事件处理。

    心跳就没什么好说的了。
    • 已标记为答案 淡叶 2009年10月25日 9:40
    2009年10月22日 15:09

全部回复

  • Hi,
    如果回调的话,可以判断。
    WCF服务是被动调用,主动获取客户端的状态有点困难。
    另外你服务实例上下文是PerCall模式的话,就更难了,实例每次调用以后就销毁。

    可以再看看,能不能查找到通过分发器找到通道的每个状态。
    这样可以知道多少个通道错误,或者关闭。


    欢迎楼下补充~
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年10月22日 9:12
    版主
  • 那个,客户首次调用的时候。给客户端通道添加一个Faulted事件处理函数就行啊。

    另外一个最保险的办法就是加心跳。
    2009年10月22日 9:16
  • 那个,客户首次调用的时候。给客户端通道添加一个Faulted事件处理函数就行啊。

    另外一个最保险的办法就是加心跳。

     能否说说具体如何实现?
    谢谢
    淡叶到此一游
    2009年10月22日 14:14
  • 那个,客户首次调用的时候。给客户端通道添加一个Faulted事件处理函数就行啊。

    另外一个最保险的办法就是加心跳。

     能否说说具体如何实现?
    谢谢
    淡叶到此一游

    举例,比如你的接口有个GetValue函数。
    在服务端可以这么写:
    void GetValue()
    {
           // 通道异常处理
           OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
          ///.....
    }

    void Channel_Faulted(object sender, EventArgs e)
    {
          // 这里写你的异常处理就行。
          throw new NotImplementedException();
    }

    另外最好也对OnClosed加上事件处理。

    心跳就没什么好说的了。
    • 已标记为答案 淡叶 2009年10月25日 9:40
    2009年10月22日 15:09
  • 那个,客户首次调用的时候。给客户端通道添加一个Faulted事件处理函数就行啊。

    另外一个最保险的办法就是加心跳。

     能否说说具体如何实现?
    谢谢
    淡叶到此一游

    举例,比如你的接口有个GetValue函数。
    在服务端可以这么写:
    void GetValue()
    {
           // 通道异常处理
           OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted);
          ///.....
    }

    void Channel_Faulted(object sender, EventArgs e)
    {
          // 这里写你的异常处理就行。
          throw new NotImplementedException();
    }

    另外最好也对OnClosed加上事件处理。

    心跳就没什么好说的了。

    嗯 谢谢了
    淡叶到此一游
    2009年10月25日 9:40