【问题标题】:SignalR giving 'The ConnectionId is in the incorrect format'SignalR 给出“ConnectionId 的格式不正确”
【发布时间】:2014-02-18 13:45:54
【问题描述】:

我有一个 SignalR 项目,它在我的开发环境中运行没有问题,但是一旦它被转移到生产环境中,几乎每个调用都会因错误而失败

ConnectionId 的格式不正确。

我在 StackOverflow 上看到了一些关于相同错误消息的其他项目,但没有一个项目有解决方案。

我正在使用 SignalR 2.0.2 和 SignalR Scaleout with SQL Server,这实际上是 SignalR 的负载平衡器,它使用 SQL Server 进行协调。

事件代码:3005 事件消息:发生未处理的异常。 活动时间:2/11/2014 9:11:27 PM 活动时间(UTC):2/12/2014 3:11:27 AM 事件 ID:cff1fd93fa6d4b83b1848078a905371c 事件序列:73 事件发生:10 事件详细代码:0 应用信息:

Application domain: /LM/W3SVC/2/ROOT-3-130366479327251392 
Trust level: Full 
Application Virtual Path: / 
Application Path: C:\inetpub\wwwroot\<remvoved>
Machine name: BSDUSHC1WW09    Process information: 
Process ID: 7088 
Process name: w3wp.exe 
Account name: <remvoved>    Exception information: 
Exception type: InvalidOperationException 
Exception message: The ConnectionId is in the incorrect format.    at

Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext 上下文,字符串连接令牌)在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 环境)在 Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult 一只老鼠 System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

请求信息: 请求URL:http:/// signalr /连接运输= serverSentEvents&connectionToken = GZlhDBCjkD1 / bL1rc4Rlq2PVKYRs0B9nN7b71cU / E6x7sCsFvR1DqM / rBnDhg + URwkYyBlGmrczV59XIn / goyt9x0xXOd8Gs3Qswo1oXqSttH2QPO548C0fbdBvvlUupzS4S0Rl + aShoQwnj + qFDpA ==&connectionData = [{ “名称”: “”}] P>

Request path: /signalr/connect 
User host address: 10.240.14.26 
User: <remvoved>
Is authenticated: True 
Authentication Type: Negotiate 
Thread account name: <remvoved>    Thread information: 
Thread ID: 23 
Thread account name: <remvoved>
Is impersonating: False 
Stack trace:    at Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId(HostContext

上下文,字符串连接令牌)在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(IDictionary`2 环境)在 Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult 一只老鼠 System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

【问题讨论】:

    标签: signalr


    【解决方案1】:

    就像在对使用 Session 的 ASP.NET 网站进行负载平衡时一样,SignalR 与 SQL Server Scaleout 要求处理 SignalR 请求的所有服务器必须共享一个机器密钥

    SignalR 的文档中没有明显提及这一点,因此我必须假设上述事件日志消息中的 connectionToken 是使用机器密钥加密的。当应用程序访问服务器 1 时,它会被分配一个使用该机器的机器密钥生成的 connectionToken。如果应用程序随后使用分配的 connectionToken 访问服务器 2,则机器 2 无法解密令牌,除非它具有匹配的机器密钥。

    网上有无数关于如何设置机器密钥的资源,所以我只留下最简单的一个。单击 IIS 8(也可能是 7)中的网站并打开机器密钥设置。单击右侧操作窗格中的Generate Keys。取消选中 Validation KeyDecryption Key 部分下的“为每个应用程序生成唯一密钥”复选框。

    【讨论】:

    • 我有一个使用 SignlaR 但不使用 SQL Server Scaleout 的 ASP.Net MVC Web 应用程序,这解决了我的问题,谢谢!
    【解决方案2】:

    虽然 Kevin 已经回答了这个问题(这对我和我都投了赞成票),但在为场中的每台服务器配置 相同的机器密钥 之后,问题仍然存在(它有时会奇怪地随机运行,但第一次尝试总是失败)。

    您还需要确保您的应用程序在每台服务器上使用相同的凭据运行。在我的场景中,应用程序池被配置为在 Network Service 下运行(它通过网络提供自己的机器凭据)。由于每个服务器都有自己的凭据,因此它们并不相同,因此问题尚未解决。

    我必须创建一个可以访问服务器场中每台服务器的用户,并让每台服务器中的应用程序都由同一个用户运行。只有在这样做之后,我的问题才得到解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-13
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多