2013-05-10 39 views
4

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

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

服务器堆栈跟踪: 在Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext上下文,字符串connectionToken) 在Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext上下文) 在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的回调,而额外对象)

而且在某些情况下,我开始反复出现这个错误。事件日志在几分钟内就会完成。 我重写了我的集线器类中的OnConnect,OnDisconnect函数,并从Java脚本启动了集线器连接。

回答

3

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

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

任何正在进行的SignalR连接将在浏览器的auth cookie更改后尝试重新连接时遇到上述的InvalidOperationException。如果使用长轮询传输,SignalR可能会尝试重新连接。一旦重新连接因异常而失败,SignalR将重复尝试重新连接约40 seconds,之后SignalR将放弃并断开连接。

+1

有关解决此问题的最佳方法的任何建议,以便在旧窗口中重新建立连接,但使用新身份? – chrisb 2013-08-23 05:07:12

+0

用户身份更改后,您将手动停止并重新启动信号连接。 – halter73 2013-08-27 18:38:15

相关问题