2011-05-27 75 views
2

我有一个简单的WCF发布/订阅和运行,based on this example。我正在使用启用了reliableSession的netTcpBinding。一切工作正常与功能(订阅的客户端收到发布的数据按预期),但在某些时候,连接超时,如果它闲置了一段时间。我可以设置发布者在超时时重新连接,但订阅的客户端将会丢失。有没有办法让他们回来?我宁愿不只是增加超时,因为这可能会导致其他问题。WCF发布/订阅:如何处理客户端超时以免错过信息?

回答

0

我最终提出的解决方案是为发布的每条消息分配一个唯一的标识符,并将发布的消息缓存到服务适配器中(在我将回调存储到订阅的客户端的同一地方。我发布了这条消息,用户将收到消息对应的唯一id,然后用户可以使用channel.Faulted事件重新连接并重新订阅服务,采用一种特殊的方法,将最后收到的消息ID作为参数。

服务代码:

/// <summary> 
    /// Operation used by the subscriber to subscribe to events published. 
    /// </summary> 
    public void Resubscribe(int lastReceivedMessageId) 
    { 
     // Get callback contract 
     IPubSubCallback callback = OperationContext.Current.GetCallbackChannel<IPubSubCallback>(); 
     ThreadPool.QueueUserWorkItem(delegate(object state) 
     { 
      adapter.Resubscribe(lastReceivedMessageId, callback); 
     }); 
    } 

适配器代码:

/// <summary> 
    /// Operation used by the subscriber to resubscribe to events published. 
    /// </summary> 
    public void Resubscribe(int lastReceivedMessageId, IPubSubCallback callback) 
    { 
     try 
     { 
      // Send the subscriber any missed messages 
      foreach (KeyValuePair<int, string> missedMessage in publishedMessages.Where(x => x.Key > lastReceivedMessageId)) 
      { 
       callback.MessagePublished(missedMessage.Value, missedMessage.Key); 
      } 

      // Add the subscriber callback to the list of active subscribers 
      if (!callbacks.Contains(callback)) 
      { 
       callbacks.Add(callback); 
      } 
     } 
     catch 
     { 
      // ignore subscription, callbacks failed again 
     } 
    } 

服务可以然后制定出什么样的客户端已经错过了,并以正确的顺序重新发送这些消息。

这个解决方案似乎对我来说很好,但我有一种感觉,必须有更好的方法来做到这一点。评论/额外答案非常受欢迎! :)

+0

如果“客户端”不是最终用户计算机,而是有限数量的服务器,则可以尝试[基于MSMQ的发布/订阅](http://blogs.msdn.com/b/tomholl/archive /2008/05/17/building-a-pub-sub-message-bus-with-wcf-and-msmq.aspx)与WCF。从这个意义上讲,这是“更好的”,保证消息被传递并且这是异步发生的。不利的一面是,在每台机器上配置MSMQ只有在设置&config自动化的情况下才可行。 – 2011-06-10 15:21:46

+0

谢谢!这种方法可能对我未来的一些发布 - 订阅需求有用。我会看看如何设置这:) – Franchesca 2011-06-10 15:59:59