2014-02-18 25 views
10

我有一个没有问题的工作在我的开发环境中SignalR项目,但一旦它被转移到生产几乎所有的通话将失败与错误SignalR给予“的的ConnectionId是格式不正确”

的ConnectionId格式不正确。

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

我使用SignalR 2.0.2和SignalR Scaleout with SQL Server,这是一个有效的负载均衡器。

事件代码:3005事件消息:发生未处理的异常。 事件时间:2014/2/11 9:11:27事件时间(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 上下文,字符串connectionToken)在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet。 SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet.S ignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment)at Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext() ---从以前位置抛出异常的堆栈跟踪结束---在 System.Runtime .ExceptionServices.ExceptionDispatchInfo.Throw()在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult的 AR)在 System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在System.Web.HttpApplication.ExecuteStep(IExecutionStep步骤中, 布尔型&同步完成)

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

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 

上下文,字符串connectionToken)在 Microsoft.AspNet.SignalR.PersistentConnection.ProcessRequest(HostContext 上下文)在 Microsoft.AspNet.SignalR.Hubs.HubDispatcher.ProcessRequest(HostContext 上下文)在Microsoft.AspNet.S。 ignalR.PersistentConnection.ProcessRequest(IDictionary`2 environment)at Microsoft.Owin.Mapping.MapMiddleware.d__0.MoveNext() ---从以前位置抛出异常的堆栈跟踪结束---在 System.Runtime .ExceptionServices.ExceptionDispatchInfo.Throw()在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult的 AR)在 System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep。在System.Web.HttpApplication.ExecuteStep执行() (IExecutionStep一步, 布尔& completedSynchronously)

回答

18

当负载平衡的ASP.NET网站,使用会话,SignalR与SQL Server Scaleout要求所有服务器就像其中处理SignalR请求必须共享机器密钥

在SignalR的文档中没有明显提到这一点,所以我必须假定上述事件日志消息中的connectionToken是使用机器密钥加密的。当应用程序访问服务器1时,会为其分配一个使用该机器的机器密钥生成的connectionToken。如果应用程序随后使用该分配的连接令牌来访问服务器2,则机器2不能解密该令牌,除非具有匹配的机器密钥。

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

3

尽管Kevin已经回答了问题(帮助我和我upvoted),但在为场中的每台服务器配置了相同的机器密钥之后,问题仍然存在(它奇怪地偶尔有时会出现,但第一次尝试总是失败)。

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

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