4

我已经创建了自己的IConnectionIdGenerator实现,为了在我的 webforms 应用程序中简单起见,通过登录的经过身份验证的用户的 EmailAddress.ToLower() 命名客户端连接 ID(如果不可用,则默认返回一个 guid)。从我背后的页面代码调用客户端一切正常。

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

但是,似乎如果我打开另一个具有相同登录用户的浏览器或选项卡,两个窗口上的永远框架连接都会不断给出 301 结果,然后交替出现 200 结果并重复。

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

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

4

3 回答 3

4

连接 ID 必须是唯一的。如果您不使它们独一无二,那么其中一个将使另一个连接脱机。在内部,我们使用连接 ID 作为连接的唯一标识符,并断开欺骗。

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

于 2012-07-23T00:58:08.177 回答
2

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

我为解决此问题所做的工作是使用默认 GUID 连接 ID,而是在启动连接后将连接添加到由我自己的 ID(在您的情况下为电子邮件地址)标识的组。这样我可以打电话Clients[emailAddress].doSomething(),它会广播到这个用户的所有打开的标签。

于 2012-07-18T11:19:26.907 回答
0

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

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

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

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

于 2012-07-18T23:36:43.193 回答