2012-07-17 67 views
4

我已经创建了自己的IConnectionIdGenerator实现这对于我的web表单应用程序名称simpicty客户端连接ID进行登录验证用户的EmailAddress.ToLower()(如果这是不可用,则它默认返回一个GUID)。 从我的页面代码调用客户端后面的所有工作正常。SignalR如何处理重复的连接ID?

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

但是看来,如果我打开另一个浏览器或标签与登录用户相同的两个在Windows的foreverframe连接不断给一个301的结果,那么200结果交替和重复。

我认为分配相同的连接ID只给我一个简单的方法,以确保正确的信息去系统的正确的用户,无论他们连接在哪里。

他们总是必须是独一无二的,我将不得不建立另一层来管理登录用户帐户的连接,或者我错过了一个诡计吗?

回答

3

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

如果你被重复301升的反应很可能是因为你有你的应用程序称为signalr一个文件夹,它是没有直接关系的共享连接ID。

2

我最近试图做同样经历了同样的问题,所以我的结论是,连接ID必须是唯一的,否则一切都开始出现故障反复301级200的响应。

我做的事,以解决此问题是使用默认的GUID连接ID,而是开始连接后加入到这是由我自己的ID(电子邮件地址,你的情况)发现了一组连接。 这样我可以拨打Clients[emailAddress].doSomething(),它会广播到此用户的所有打开的标签。

+0

但是你失去了使用'AllExcept()'的能力,它从外观上不支持组。 – georgiosd 2012-12-20 11:26:32

0

是的,这是完美的,我来到了一个类似的结论。

我也试图想办法让客户端广播消息特有的当前URL(这样一个页面上的进度条不还更新另一个进度条)

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

这可能是更好的,如果我只是标签上的一些客户端检查和发送进度条的ID作为参数,其特有的精神疾病是要更新页面上的进度条。