SignalR:连接ID格式不正确。如何在会话到期时处理它?

时间:2014-05-15 18:58:34

标签: asp.net asp.net-mvc asp.net-mvc-4 signalr

我已经提出了一个众所周知的SignalR问题,它在googled时会产生多个结果"连接ID的格式不正确。"但是我找不到符合我需求的解决方案。建议的所有解决方案都是相同的:在客户端的javascript中停止signalR。但是,我需要的是以某种方式停止或处理服务器端的错误。

示例:用户登录,SignalR启动,一切正常,他点击注销(就在注销之前我覆盖javascript事件并停止SignalR)。没错。

另一个例子:用户登录,SignalR启动,用户等待会话结束一段时间。他点击了一些东西,他被扔到了登录页面。但是,SignalR现在注意到用户的身份已更改并抛出此错误连接ID格式不正确。添加其中一些发生,我让我的IIS工作在100%CPU工作,从而导致崩溃的服务器。一个有点修改的例子包括SignalR ping服务器并再次看到会话已经结束,从而引发异常。

我该如何处理这个问题?有没有办法从服务器端停止某个客户端的SignalR?或者可能有些不同?也许我可以让SignalR以某种方式停止依赖身份?我相信人们必须已经以某种方式解决了这个问题。我在我的项目中使用Forms身份验证和MVC4。 SignalR的版本是1.0.0。我知道这不是最新的,但我怀疑如果它是最新的,它会有任何好处。或者有人证明我错了?

我在IIS日志中添加错误信息以防万一:

Exception information: 
    Exception type: InvalidOperationException 
    Exception message: 

Server stack trace: 
   at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext context, String connectionToken)
   at Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext context)
   at Microsoft.AspNet.SignalR.Owin.CallHandler.Invoke(IDictionary`2 environment)
   at Microsoft.AspNet.SignalR.Owin.Handlers.HubDispatcherHandler.Invoke(IDictionary`2 environment)
   at Microsoft.Owin.Host.SystemWeb.OwinCallContext.Execute()
   at Microsoft.Owin.Host.SystemWeb.OwinHttpHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object extraData)

Exception rethrown at [0]: 
   at Microsoft.Owin.Host.SystemWeb.Utils.<>c__DisplayClass1.<GetRethrowWithNoStackLossDelegate>b__0(Exception ex)
   at Microsoft.Owin.Host.SystemWeb.CallContextAsyncResult.End(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)



Request information: 
    Request URL: http://example.com:port/signalr/abort?transport=serverSentEvents&connectionToken=0D8V3TwV78z1cU7_kbQGaSjZH1r_w4eGkkFPRftDiZXPJjbEZmXEluSOkvzVBDRQOGWzVPGfeCKdsvEUwhzb07-Kph-pJ3oog_ydjvsRSnoXqDnYZkPXwJgPrFsFYtmpFDKe0hOvHS7ZxApQF_4fbw2 
    Request path: /signalr/abort 
    User host address: A.B.C.D 
    User:  
    Is authenticated: False 
    Authentication Type:  
    Thread account name: IIS APPPOOL\DefaultAppPool 

Thread information: 
    Thread ID: 63 
    Thread account name: IIS APPPOOL\DefaultAppPool 
    Is impersonating: False 
    Stack trace:    at Microsoft.Owin.Host.SystemWeb.Utils.<>c__DisplayClass1.<GetRethrowWithNoStackLossDelegate>b__0(Exception ex)
   at Microsoft.Owin.Host.SystemWeb.CallContextAsyncResult.End(IAsyncResult result)
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

3 个答案:

答案 0 :(得分:1)

只是“大声思考”,如果问题仅仅是因为会话过期,您可能希望在会话结束时在服务器上进行拦截并向所有受影响的客户端广播消息(要为此添加逻辑) )要求他们明确断开连接,避免他们颠倒你的服务器。我猜您的会话与身份验证相关联,因此无论如何都必须进行登录,因此您将在此之后重新连接SignalR。说得通?

您还可以在N-1分钟后使客户端超时到期,其中N是会话的持续时间。让那一个人断开连接。如果服务器上发生的事情使时间窗移动,则可以使用SignalR自身更新超时本身。

两者都是务实,快速和肮脏的解决方案,可以将SignalR和Session保持在一起。

答案 1 :(得分:0)

您可以在thread中找到一个很好的解释。看来你不能以某种方式使用Session与SignalR。 我希望它会对你有所帮助。

答案 2 :(得分:0)