Signalr 信号机给出';ConnectionId的格式不正确';

Signalr 信号机给出';ConnectionId的格式不正确';,signalr,Signalr,我有一个SignalR项目,它在我的开发环境中正常工作,但一旦它被转移到生产环境中,几乎每个调用都会因错误而失败 ConnectionId的格式不正确 我在StackOverflow上看到了一些关于同一错误消息的其他项目,但没有一个解决方案能起到帮助作用 我使用的是Signalr2.0.2,实际上是一个使用SQLServer进行协调的SignalR负载平衡器 事件代码:3005事件消息:发生未处理的异常。 事件时间:2014年11月2日9:11:27下午事件时间(UTC):2014年12月2日3

我有一个SignalR项目,它在我的开发环境中正常工作,但一旦它被转移到生产环境中,几乎每个调用都会因错误而失败

ConnectionId的格式不正确

我在StackOverflow上看到了一些关于同一错误消息的其他项目,但没有一个解决方案能起到帮助作用

我使用的是Signalr2.0.2,实际上是一个使用SQLServer进行协调的SignalR负载平衡器

事件代码:3005事件消息:发生未处理的异常。 事件时间:2014年11月2日9:11:27下午事件时间(UTC):2014年12月2日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
应用程序域:/LM/W3SVC/2/ROOT-3-130366479327251392
信任级别:完全信任
应用程序虚拟路径:/
应用程序路径:C:\inetpub\wwwroot\
机器名称:BSDUSHC1WW09过程信息:
进程ID:7088
进程名称:w3wp.exe
帐户名称:异常信息:
异常类型:InvalidOperationException
异常消息:ConnectionId的格式不正确。在
Microsoft.AspNet.signal.PersistentConnection.GetConnectionId(HostContext 上下文,字符串connectionToken)位于 Microsoft.AspNet.signar.PersistentConnection.ProcessRequest(HostContext (上下文)在 Microsoft.AspNet.signal.Hubs.HubDispatcher.ProcessRequest(HostContext (上下文)在 Microsoft.AspNet.signal.PersistentConnection.ProcessRequest(IDictionary`2 (环境)在 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步骤, 布尔值(同步完成(&C))

请求信息: 请求URL:http:///signalr/connect?transport=serverSentEvents&connectionToken=GZlhDBCjkD1/bL1rc4Rlq2PVKYRs0B9nN7b71cU/E6x7sCsFvR1DqM/rBnDhg+URwkYyBlGmrczV59XIn/GOYT9X0xXOD8GS3QSWO1OXQSTTH2QPO548C0FBDBVVLLUUPZS4S0RL+ASHOQWWNJ+qFDpA==&connectionData=[{“名称”:“}]

请求路径:/signal/connect
用户主机地址:10.240.14.26
用户:
已验证:True
身份验证类型:协商
线程帐户名称:线程信息:
线程ID:23
线程帐户名称:
是模仿:假
堆栈跟踪:位于Microsoft.AspNet.signal.PersistentConnection.GetConnectionId(HostContext
上下文,字符串connectionToken)位于 Microsoft.AspNet.signar.PersistentConnection.ProcessRequest(HostContext (上下文)在 Microsoft.AspNet.signal.Hubs.HubDispatcher.ProcessRequest(HostContext (上下文)在 Microsoft.AspNet.signal.PersistentConnection.ProcessRequest(IDictionary`2 (环境)在 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步骤, 布尔值(同步完成(&C))


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

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


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

尽管Kevin已经回答了这个问题(这帮助了我和我的投票),但在为服务器场中的每台服务器配置了相同的机器密钥后,问题仍然存在(有时它会随机工作,但第一次尝试总是失败)

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


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

我有一个ASP.Net MVC web应用程序,它使用SignlaR而不是SQL server Scaleout,这解决了我的问题,谢谢!
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