我使用的是signalr2.2 web应用程序,托管在IIS-8中。在这里,我尝试使用ARR3.0为我的应用程序实现负载平衡。在我的服务器场中,我连接了两台服务器,并将路由规则设置为"加权循环"。每个服务器都有一个带有HTML页面的javascript客户端。当我访问任何服务器的HTML页面时,请求已按预期路由,但我的HTML页面中出现此错误,信号员无法连接
WebSocket连接到"ws://mydomain.com/signalr/connect"?transport=webSockets&客户端协议=1.5&connectionToken=x9rAfatyMm3TqzrYKL1K37Z4tKrUTH7bwNmItW55Z0ms6pee43YiQGFOMAHMyT%2BpmGz62ukt4tha72vPcJhdqLtIvsQvqvY15oYGv69JjzSuuiSL7v2l%2FccZT6tQa3Z&connectionData=%5B%7B%22名称%22%3A%22聊天中心%22%7D%5D&tid=1'失败:WebSocket握手期间出错:意外的响应代码:400
如果我让服务器场中该服务器的任何人离线,signaler工作正常,不会引发任何错误。帮我找到解决方案
如果我从.net客户端应用程序与信号服务器通信,它将抛出以下错误
启动请求期间出错。正在停止连接。
我也遇到了这个问题。更深入地看,错误是:The connection id is in the incorrect format
。在谷歌上搜索了一下之后,我在某个地方读到,当运行农场环境时,服务器需要共享相同的机器密钥,这可以在IIS中进行配置。
为此,请遵循以下步骤:
- 打开连接到服务器场中任何服务器的IIS
- 在服务器节点中,打开右侧窗格中的机器密钥选项
- 在右侧菜单中,单击生成密钥
- 取消选中验证密钥和解密密钥
- 复制生成的两个键(例如粘贴在记事本中)
- 确保服务器场中的所有服务器共享相同的密钥(ARR服务器不需要此密钥),您可能需要在它们中重复上述步骤(也许它们使用共享配置后您就不需要了)
此外,您需要确保每个服务器中的应用程序使用相同的标识。例如,选择您的应用程序节点(或站点节点,如果是这样的话),在右菜单中选择基本设置,然后连接为…。如果选择的选项是应用程序用户,则您需要检查应用程序池的配置情况。如果它使用网络服务(就像我的一样),您仍然会遇到问题,因为每个服务器都使用自己的凭据,但您必须确保它们使用相同的标识。
在我的场景中,我必须创建一个可以访问服务器场中每台服务器的用户,并使应用程序使用同一个用户。只有这样,我的问题才得以解决。
除了@Alisson的回答,我还找到了一种设置机器键的简单方法。
您可以在Web.config文件中直接执行此设置。只需在system.web部分下为machineKey创建一个条目。条目看起来像
<system.web>
<machineKey validationKey="###############YOUR#####VALIDATION ######KEY####################################################################################" decryptionKey="#####YOUR####DECRYPTION#####KEY#################" validation="SHA1" decryption="Auto" />
</system.web>
通过@Alisson的回答中给出的步骤,可以生成唯一的验证密钥和解密密钥 通过使用这种方法,您不需要担心在任何时候服务器的更改或在任何其他web场服务器上的部署。您的代码将在没有任何问题的情况下运行。