我已经创建了自己的IConnectionIdGenerator
实现这对于我的web表单应用程序名称simpicty客户端连接ID进行登录验证用户的EmailAddress.ToLower()(如果这是不可用,则它默认返回一个GUID)。 从我的页面代码中调用客户端背后的一切工作正常。
hubContext.Clients[LoggedInUser.EmailAddress.ToLower()].updateProgress(i)
然而,它看来,如果我打开另一个浏览器或标签与登录的用户都可以在Windows的foreverframe连接不断给一个301的结果,那么200结果交替和重复相同。
我认为分配相同的连接ID只给我一个简单的方法,以确保正确的信息去系统的正确的用户,无论他们连接在哪里。
他们总是必须是唯一的,我将要建一个层来管理登录的用户帐户的连接还是我这里缺少一个把戏?
连接ID必须是唯一的。 如果你不使他们独特的一个,然后将另一个连接离线踢。 我们内部使用的连接ID为连接的唯一标识符,我们断开受骗者。
如果你被重复301升的反应很可能是因为你有你的应用程序称为signalr一个文件夹,它是没有直接关系的共享连接ID。
最近,我试图做同样经历了同样的问题,所以我的结论是,连接ID必须是唯一的,否则一切都开始出现故障反复301级200的响应。
我所做的,以解决此问题是使用默认的GUID连接ID,而是开始连接后加入到这是由我自己的ID(电子邮件地址,你的情况)发现了一组连接。 这样我可以调用Clients[emailAddress].doSomething()
并将其广播到该用户所有打开的标签。
这就是是完美的,我来到了一个simlar结论。
我也试图想办法让客户端广播消息特有当前URL的电子邮件地址组(这样一个页面上的进度条不还更新另一个进度条)
我将要么使延长组ID是像emailAddress + currentURL
所以它只是两个字符串的组合。 然而,这将使任何全球现场广播(所有URL)很难做到,除非有获得团体收集和分析了电子邮件地址和发送邮件的每个电子邮件地址+网址组合的方式。
这可能是更好的,如果我只是标签上的一些客户端检查和发送进度条的ID作为参数,其特有的精神疾病是要更新页面上的进度条。