小编Fra*_*ngs的帖子

在活动SignalR连接期间更改用户身份 - 如何重新连接?

我遇到了SignalR和用户在ASP.NET MVC 4应用程序中更改身份的问题.我正在使用自定义成员资格提供程序的Forms身份验证.

我有SignalR的视图也有一个登录(和注销)按钮,登录和注销的用户都必须能够查看这个视图(并且都连接到与之关联的SignalR组)视图).但是,当人们登录时,我一直遇到麻烦.当用户身份发生变化时,建议的做法是"重新连接"基础SignalR连接?该视图是其他操作显示的其他视图之一.这是唯一包含SignalR javascript的人.

事实上,我甚至都不是对用户的身份感兴趣,因此以某种方式关闭用户亲和力就行了(但我找不到办法做到这一点).用户更改也可以触发页面重新加载,因为登录/注销发生在除维持连接的窗口之外的窗口中,因此后者没有用户的焦点.

问题,换句话说:当用户身份从登录用户更改为已注销用户时,如何保持基础SignalR连接,反之亦然?

我尝试过的事情

  1. 在页面上处理登录/注销事件,如下所示: $("a[href='/Account/Logout']").click(function () { $.connection.hub.stop(); });

    这可行,但这将要求用户能够登录或退出的每个页面上的SignalR,而不仅仅是实际使用SignalR的页面.

  2. 在使用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与存储在连接令牌中的内容进行了比较.这一切都有道理,但我正在寻找的是一种解决方法.

我正在使用Microsoft.AspNet.SignalR 1.1.2.

asp.net-mvc asp.net-mvc-4 signalr

10
推荐指数
1
解决办法
4507
查看次数

标签 统计

asp.net-mvc ×1

asp.net-mvc-4 ×1

signalr ×1