我遇到了SignalR和用户在ASP.NET MVC 4应用程序中更改身份的问题.我正在使用自定义成员资格提供程序的Forms身份验证.
我有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);
});
Run Code Online (Sandbox Code Playgroud)
出于本示例的目的,我更改了一些名称.基本上,我想监视页面上显示的项目列表的更改.我使用列表的id作为标识符加入组.
异常消息是" System.InvalidOperationException:无法识别的用户身份.在活动的SignalR连接期间,用户身份不能更改." 它来自Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId.我查找了源代码,并将实际内容context.Request.User.Identity.Name与存储在连接令牌中的内容进行了比较.这一切都有道理,但我正在寻找的是一种解决方法.