在重新连接

时间:2016-05-18 14:32:50

标签: c# jquery push-notification signalr jabbr

我在我的应用程序中使用SignalR将消息发送给组中的不同用户。

我们可以添加/编辑或删除消息,并通过SignalR中心向该组中的所有用户发送相同的操作。

一切正常。

问题是人们可能会错过在他的连接丢失/互联网断开或他的笔记本电脑/机器关闭期间发生的其他人行动(消息添加/编辑/删除)。

在重新连接或再次打开笔记本电脑后,用户必须收到所有这些错过的消息,以及在他离线时发生的错过的操作。

我们将所有用户的所有客户端(客户端ID)存储在数据库中。

任何人都可以指点如何做到这一点吗?

一个解决方案可以是将最后一个消息ID(已经到ui)轮询到服务器,检查是否有任何新消息但是不能用于此目的,因为消息可能已在其他服务器上编辑/删除用户。

我已经浏览了以下链接

Can SignalR handle missed messages?

Can a SignalR message loss be detected server side?

How to do guaranteed message delivery with SignalR?

Signalr client to retrieve missed messages on reconnect

https://github.com/JabbR/JabbR/issues/699

但它们都没有涵盖用户离线时发生的整个历史记录的方面。

例如,如果您在Skype中断开连接并在几小时后回来说它会提取在此期间发生的所有操作的历史记录(添加/编辑/删除的消息)并将其更新为最终用户

1 个答案:

答案 0 :(得分:0)

由于SignalR不提供任何消息传递保证,因此应自己解决。

有几种方法:

首先是使用消息队列(例如:RabbitMQ)。 这是确保邮件传递到客户端的最有效方法。 但是在您的情况下,您需要将消息队列与发布/订阅通信方式结合起来。那可能很棘手。

第二种方法在您引用的SO帖子之一的答案中进行了描述:Can SignalR handle missed messages?。 不要通过信号发送器发送数据,仅发送通知;然后从服务器获取数据更新。 这是我最喜欢的客户端-服务器通知/更新方案方式。我会选择您的情况。

一种解决方案是将最后一个消息ID(已到达ui)轮询到服务器,以检查是否有新消息存在,但不能达到目的,因为该消息可能已在服务器上被其他用户编辑/删除。

要解决此问题,您不能轮询最后一条消息,而是轮询自上次更新以来在会话中进行的操作的历史记录(添加/更新/删除消息操作),并将其应用于客户端。

相关问题