SignalR 2.2 和 ARR3.0 负载平衡

SignalR 2.2 and ARR3.0 Load balancing

我正在使用 signalr2.2 Web 应用程序并托管在 IIS-8 中。在这里,我尝试使用 ARR3.0 为我的应用程序实现负载平衡。在我的服务器场中,我连接了两台服务器并将路由规则设置为 'weighted round robin'。每个服务器都有一个带有 HTML 页面的 javascript 客户端。当我访问任何服务器的 HTML 页面时,请求已按预期路由,但我的 html 页面出现此错误并且信号器未连接

WebSocket connection to 'ws://mydomain.com/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=x9rAfatyMm3TbqzrYKL1K37Z4tKrUTH7bwNmSItW55Z0ms6pe43YiQGFOmaHMyT%2BpmGz62ukt4tha72vPcJhdqLtIvsQvqvY15oYGv69JjzSuuiSL7v2l%2FccZT6tQa3Z&connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&tid=1' failed: Error during WebSocket handshake: Unexpected response code: 400

如果我在我的服务器场中让这个服务器的任何人脱机,signalr 工作正常并且不会抛出任何错误。帮我找到解决办法。

如果我从 .net 客户端应用程序与信号服务器通信,它将抛出以下错误

Error during start request. Stopping the connection.

我也遇到了这个问题。更深入地看,错误是:The connection id is in the incorrect format。在谷歌搜索了一下后,我在某处读到,当 运行 农场环境时,服务器需要共享相同的机器密钥,这可以在 IIS 中配置。

为此,请按照以下步骤操作:

  • 打开连接到场中任何服务器的 IIS。
  • 在服务器节点中,打开右侧窗格中的机器密钥选项
  • 在右侧菜单中,单击生成密钥
  • 取消选中验证密钥解密密钥Generate a unique key for each application选项。
  • 复制生成的两个密钥(例如粘贴到记事本中)
  • 确保场中的所有服务器都共享相同的密钥(ARR 服务器不需要这个),您可能需要在它们中重复上述步骤(也许一旦它们使用共享配置您就不需要).

此外,您需要确保您的应用程序在每个服务器中使用相同的身份。例如,select 您的应用程序节点(或站点节点,如果是这种情况),在右侧菜单中 select 基本设置 ,然后 连接为...。如果 selected 选项是 Application user,那么您需要检查您的应用程序池是如何配置的。如果它使用 Network Service(就像我的一样),您仍然会遇到问题,因为每个服务器都使用自己的凭据,但您必须确保它们使用相同的身份。

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

除了@Alisson 的回答之外,我还找到了一种简单的方法来设置 机器密钥

您可以直接在 Web.config 文件中进行此设置。 简单地在 system.web 部分下为 machineKey 创建一个条目。 该条目看起来像

<system.web>   
    <machineKey validationKey="###############YOUR#####VALIDATION ######KEY####################################################################################" decryptionKey="#####YOUR####DECRYPTION#####KEY#################" validation="SHA1" decryption="Auto" />
</system.web>

唯一的验证密钥解密密钥可以通过@Alisson 的回答中给出的步骤生成。

通过使用这种方法,您无需担心服务器在任何时候发生变化或部署在任何其他网络场服务器上。您的代码将 运行 没有任何问题。