基于此示例,我有一个简单的 WCF 发布/订阅启动并运行。我正在使用启用了可靠会话的 netTcpBinding。该功能一切正常(订阅的客户端按预期接收发布的数据),但如果连接空闲一段时间,连接会超时。我可以设置发布者在超时时重新连接,但订阅的客户端将会丢失。有没有办法让他们回来?我不希望仅仅增加超时,因为这可能会导致其他问题。
问问题
1015 次
1 回答
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
}
}
然后,该服务可以计算出客户端错过了什么,并以正确的顺序重新发送这些消息。
这个解决方案似乎对我来说效果很好,但我觉得必须有更好的方法来做到这一点。非常欢迎评论/补充答案!:)
于 2011-06-10T15:01:31.727 回答