我最終提出的解決方案是爲發佈的每條消息分配一個唯一的標識符,並將發佈的消息緩存到服務適配器中(在我將回調存儲到訂閱的客戶端的同一地方。我發佈了這條消息,用戶將收到消息和對應的唯一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
}
}
服務可以然後制定出什麼樣的客戶端已經錯過了,並以正確的順序重新發送這些消息。
這個解決方案似乎對我來說很好,但我有一種感覺,必須有更好的方法來做到這一點。評論/額外答案非常受歡迎! :)
如果「客戶端」不是最終用戶計算機,而是有限數量的服務器,則可以嘗試[基於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
謝謝!這種方法可能對我未來的一些發佈 - 訂閱需求有用。我會看看如何設置這:) – Franchesca 2011-06-10 15:59:59