【发布时间】:2014-05-27 22:26:03
【问题描述】:
我提出了一个众所周知的 SignalR 问题,当用谷歌搜索“连接 ID 的格式不正确”时会给出多个结果。但是我找不到适合我需要的解决方案。建议的所有解决方案都是相同的:在客户端的 javascript 中停止 signalR。但是,我需要以某种方式停止或处理服务器端的错误。
示例:用户登录,SignalR 启动,一切正常,他单击注销(就在注销之前,我覆盖了 javascript 事件并停止 SignalR)。没有错误。
另一个例子:用户登录,SignalR 启动,用户等待一段时间会话结束。他点击了一些东西,他被扔到了登录页面。但是,SignalR 现在注意到用户的身份已更改并抛出此错误连接 ID 格式不正确。添加其中一些发生的情况,我的 IIS Worker 以 100% 的 CPU 工作,从而导致服务器崩溃。稍加修改的示例包括 SignalR ping 服务器并再次看到会话已结束并因此引发异常。
我应该如何处理这样的问题?有没有办法从服务器端为某些客户端停止 SignalR?或者也许是不同的东西?也许我可以让 SignalR 以某种方式停止依赖身份?我相信人们一定已经以某种方式解决了这个问题。我在我的项目中使用表单身份验证和 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)
【问题讨论】:
-
你使用 Redis / SQL Server scaleout 吗?
-
@MosheL 不,我没有。从未真正听说过这些。
标签: asp.net asp.net-mvc asp.net-mvc-4 signalr