如何从服务器向WCF中的所有客户端发送通知消息(您可以说是广播)?

时间:2009-06-17 09:38:09

标签: wcf notifications broadcast wcf-callbacks

我想每秒从net tcp WCF服务向所有客户端发送通知消息, 你可以说广播吗?

有用的答案之后

我写了以下方法,它会向所有连接的用户发送通知(心跳)

foreach (IHeartBeatCallback callback in subscribers)
{
  ThreadPool.QueueUserWorkItem(delegate(object state)
  {
    ICommunicationObject communicationCallback = (ICommunicationObject)callback;
    if (communicationCallback.State == CommunicationState.Opened)
    {
      try
      {
         callback.OnSendHeartBeat(_heartbeatInfo.message,    _heartbeatInfo.marketstart,_heartbeatInfo.marketend, _heartbeatInfo.isrunning,   DateTime.Now);
      }
      catch (CommunicationObjectAbortedException)
      {
        Logger.Log(LogType.Info, "BroadCast", "User aborted");
        communicationCallback.Abort();
      }
      catch (TimeoutException)
      {
       Logger.Log(LogType.Info, "BroadCast", "User timeout");
       communicationCallback.Abort();
      }
      catch (Exception ex)
      {
        Logger.Log(LogType.Error, "BroadCast", "Exception " + ex.Message + "\n" +  ex.StackTrace);
        communicationCallback.Abort();
      }

    }
    else
    {
      DeletionList.Add(callback);
    }
  }
  );
}

我担心调用回调方法,因为客户端可能会关闭他的应用程序,但我使用try catch处理它,减少超时,并且并行发送广播,那就足够了吗?

2 个答案:

答案 0 :(得分:5)

您需要设置回拨服务;我在前一段时间写了simple beginners guide

答案 1 :(得分:2)

为了做到这一点,你需要创建并保留所有连接客户端的列表(通常的做法是创建LogIn和LogOut方法来创建和管理代表客户端的对象列表,包括他们的CallbackContext)。 然后,使用System.Time.Timers,您可以遍历连接的客户端列表并发送通知。

提示。如果服务无法向其发送回调,则此方法还可以通过添加可能性从列表中删除客户端来充当Keep-Alive或Hear-Beat方法(如果这不是设计目的)。