2013-02-25 151 views
2

我已经开始尝试使用SignalR。我一直在想出一个灵活的方式来存储关于每个连接客户端的信息。例如,将该名称存储在聊天应用程序中,而不是将其传递给每个消息。SignalR - 存储客户端信息

此刻,我有一个静态字典,它将connectionId与包含这些属性的对象相匹配。我在连接上添加了这本词典,并在断开连接时删除。

我遇到的问题是我似乎没有得到所有的断开连接事件。如果我在Chrome中关闭了某个标签,则断开连接似乎已经结束。但是,如果我快速重新加载选项卡,断开似乎不会发生(至少不是“干净地”)。例如,如果我一遍又一遍地重新载入同一个标签,它会告诉我我的字典有多个项目 - 理论上它应该是一个。

是否存在这种每种连接信息的标准存储方式?否则,可能会导致我遇到的问题?

回答

1

实际上,您正在正确处理连接ID数据。确保您只是在OnConnected中实例化您的用户数据,并在OnDisconnected中取消其实例。

当您的页面发送垃圾信息刷新时,会导致OnDisconnected事件不会立即触发。但是你不应该担心这个,因为SignalR会在指定的超时(DisconnectTimeout)后超时连接并触发OnDisconnected事件。

如果您发现OnConnected和OnDisconnected事件(经过大量时间)后没有1对1关联的场景,请确保在https://github.com/SignalR/SignalR/issues处提交错误。

最后,如果你正在寻找一些先进的聊天机制,并寻找灵感检查JabbR,它是开源的!

https://github.com/davidfowl/JabbR

希望这有助于!

+0

是的,谢谢,这有助于很多。总是很高兴听到我做得正确!我不知道超时 - 这是可配置的吗? 另外,我将如何处理OnReconnect事件? Yup! – Barguast 2013-02-26 00:28:18

+1

是! GlobalHost.Configuration.DisconnectTimeout。对于重新连接,你应该检查你的用户是否存在,如果它没有做任何事情,如果它不然后添加=)。 – 2013-02-26 01:22:25

+0

检查用户是否存在 - 这是否表示是否存在具有提供的connectionID的条目?我仍然对连接*真正*代表的是什么,它的一生如何,等等我有点模糊。我会给文档一个完整的阅读。 – Barguast 2013-02-26 12:17:21