SignalR如何处理重复的连接ID?

时间:2012-07-17 12:04:43

标签: asp.net signalr

我已经创建了自己的IConnectionIdGenerator实现,为了简化我的webforms应用程序,通过登录认证用户的EmailAddress.ToLower()命名客户端连接ID(如果没有,那么它默认返回一个guid )。 从我的页面代码调用客户端一切正常。

hubContext.Clients[LoggedInUser.EmailAddress.ToLower()].updateProgress(i)

然而,如果我打开另一个具有相同登录用户的浏览器或选项卡,两个窗口上的永久帧连接都会保持给出301结果,然后交替重复200个结果。

我认为分配相同的连接ID只会给我一个简单的方法,无论他们在哪里连接,都能确保消息正确地传递给系统的正确用户。

它们总是必须是唯一的,我是否必须构建另一个层来管理与登录用户帐户的连接,或者我在这里错过了一个技巧?

3 个答案:

答案 0 :(得分:4)

连接ID必须是唯一的。如果你没有使它们独一无二,那么一个人将使另一个连接脱机。在内部,我们使用连接ID作为连接的唯一标识符,我们断开连接。

如果您重复301回复,可能是因为您的应用中有一个名为signalr的文件夹,并且与共享连接ID没有直接关系。

答案 1 :(得分:2)

我最近尝试过这样做并遇到了同样的问题,所以我的结论是连接ID必须是唯一的,否则一切都会因重复的301和200响应而开始失败。

我解决此问题的方法是使用默认的GUID连接ID,而是在开始连接后将连接添加到由我自己的ID(在您的情况下为电子邮件地址)标识的组中。 通过这种方式,我可以调用Clients[emailAddress].doSomething()并将其广播到此用户的所有打开的标签页。

答案 2 :(得分:0)

是的,那是完美的,我得出了一个类似的结论。

我还试图想办法将客户端广播消息发送到当前网址唯一的同一个电子邮件地址组(因此一个页面上的进度条也不会更新另一个页面上的进度条)

我要么将组ID扩展为emailAddress + currentURL,所以它只是两个字符串的组合。然而,除非有办法获取群组集合并解析出电子邮件地址并将消息发送到每个电子邮件地址+网址组合,否则这将使任何全球网站广播(对所有网址)都难以做到。

如果我只是在某个客户端标记检查并发送进度条Id作为参数,可能会更好,该参数对于要更新的​​页面上的进度条是唯一的。