我有SignalR的视图也有一个登录(和注销)按钮,并且登录和注销的用户必须能够看到这个视图(并且都连接到与该关联的SignalR组相关联)视图).但是,当用户登录时,我会遇到麻烦.当用户身份发生变化时,建议的“重新连接”SignalR连接的做法是什么?该视图是由其他操作显示的其他几个视图之一.这是唯一一个包含SignalR的JavaScript.
事实上,我甚至对所有用户的身份感兴趣,所以把用户关注点转移到某种程度上就可以了(但是我找不到一个方法).用户更改可以触发页面重新加载,因为登录/注销发生在除了维护连接的窗口之外的窗口中,因此后者没有用户的焦点.
这个问题,换句话说:当用户身份从登录用户更改为已注销的用户时,如何保持基本的SignalR连接,反之亦然?
我试过的事情
>在页面上处理登录/注销事件,如下所示:
$(“a [href =’/ Account / logout’]”).click(function(){
$.connection.hub.stop();
});
这有效,但这将需要SignalR在用户所在的每个页面上
能够登录或登出,而不仅仅是实际使用SignalR的用户.
>在与ASP.NET会话ID相关联的集线器上添加一个额外的组,这在登录和注销之间保持一致.登录或注销后,我通过发送具有该会话ID的组来通知客户端以重新连接触发器.这只是事实证明是太晚了,在请求结束时,身份已经被改变了,所以异常被解雇了.
有关我的设置的更多细节
对于这种特殊用例,用户会看到包含SignalR的页面.我按照惯例加入中心:
var hub = $.connection.theNameOfTheHub; $.connection.hub.start().done(function () { hub.server.joinList(id); });
为了这个例子的目的,我改了几个名字.基本上,我想监控页面上显示的项目列表中的更改.我使用列表的id作为标识符加入一个组.
异常消息是“System.InvalidOperationException:无法识别的用户身份”.在活动的SignalR连接期间,用户身份不能更改.它来自Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId.我查找了源代码,并将实际的context.Request.User.Identity.Name与存储在连接令牌中的context进行比较.这一切都是有道理的,但我正在寻找的是一种解决方法.