2011-05-27 44 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

相關問題