4

我最近开始在 ASP.Net MVC 3 应用程序中使用 Signal R 库。我可以使用 Signal R 向客户端发送消息。但我注意到,如果我从另一个浏览器登录到应用程序,我会收到以下错误 -

异常类型:InvalidOperationException 异常消息:无法识别的用户身份。在活动 SignalR 连接期间,用户身份无法更改。

服务器堆栈跟踪:在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context) 在 Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary 2 environment) at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary2 ) 的 Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken)环境)在 Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback 回调,对象 extraData)的 Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute()

在某些情况下,我开始反复收到此错误。并且事件日志会在几分钟内填满。我在集线器类中覆盖 OnConnect、OnDisconnect 函数,并从 Java 脚本启动集线器连接。

4

1 回答 1

3

SignalR 不允许在保持连接时更改用户的身份。这是因为 SignalR 的 connectionToken 充当反 xsrf 令牌。

看来您的“其他”浏览器实际上必须只是另一个浏览器窗口。当您在另一个窗口中登录应用程序时,它会在两个浏览器窗口中更改您的 ASP.NET 表单身份验证 cookie(以及您的身份)。

任何正在进行的 SignalR 连接在浏览器的身份验证 cookie 更改后尝试重新连接时都会遇到上述 InvalidOperationException。如果正在使用长轮询传输,SignalR 可能会非常频繁地尝试重新连接。一旦由于异常导致重新连接失败,SignalR 将反复尝试重新连接,大约40 seconds在此之后 SignalR 将放弃并断开连接。

于 2013-05-11T02:46:07.680 回答