我最终提出的解决方案是为发布的每条消息分配一个唯一的标识符,并将发布的消息缓存到服务适配器中(在我将回调存储到订阅的客户端的同一地方。我发布了这条消息,用户将收到消息和对应的唯一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