我最近开始在ASP.Net MVC 3应用程序中使用Signal R库。我能够使用Signal R向客户端发送消息。但我注意到,如果我从另一个浏览器登录到该应用程序,我会收到以下错误 -
异常类型:InvalidOperationException 异常消息:无法识别的用户身份。在活动的SignalR连接期间,用户身份不能更改。
服务器堆栈跟踪:
在Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context,String connectionToken)
在Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context)
在Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary 2 environment)
at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary
2环境)
在Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute()
在Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext,AsyncCallback回调,Object extraData)
在某些情况下,我开始反复出现此错误。事件日志会在几分钟内完成。 我在我的集线器类中覆盖了OnConnect,OnDisconnect函数,并从Java脚本启动了集线器连接。
答案 0 :(得分:3)
在维持连接时,SignalR不允许用户Identity更改。这是因为SignalR的connectionToken充当了反xsrf令牌。
看来你的“其他”浏览器实际上只是另一个浏览器窗口。当您在另一个窗口中登录该应用程序时,它会在两个浏览器窗口中更改您的ASP.NET窗体身份验证cookie(以及您的身份)。
任何正在进行的SignalR连接在浏览器的auth cookie更改后尝试重新连接时都会遇到上述的InvalidOperationException。如果使用长轮询传输,SignalR可能会尝试非常频繁地重新连接。一旦重新连接因异常而失败,SignalR将重复尝试重新连接约40 seconds
,之后SignalR将放弃并断开连接。