【问题标题】:SignalR 2.2 and ARR3.0 Load balancingSignalR 2.2 和 ARR3.0 负载平衡
【发布时间】:2016-07-29 04:43:35
【问题描述】:

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

的WebSocket为“WS连接://mydomain.com/signalr/connect运输=&的WebSockets clientProtocol = 1.5&connectionToken = x9rAfatyMm3TbqzrYKL1K37Z4tKrUTH7bwNmSItW55Z0ms6pe43YiQGFOmaHMyT%2BpmGz62ukt4tha72vPcJhdqLtIvsQvqvY15oYGv69JjzSuuiSL7v2l%2FccZT6tQa3Z&connectionData =%5B%7B%22name%22%3A%22chathub%22%7D%5D&TID? =1' 失败:WebSocket 握手期间出错:意外响应代码:400

如果我在我的服务器群中使该服务器的任何人脱机,信号器工作正常,不会抛出任何错误。帮助我找到解决方案。

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

启动请求期间出错。停止连接。

【问题讨论】:

  • 您需要在场中的所有服务器上设置相同的机器密钥
  • 嗨@janithat000,我需要澄清一下,在实现机器密钥更改后的服务器场中,每当我点击 url 时,onconnected 发生在一台服务器上,而集线器方法调用发生在另一台服务器上。这是路由中的程序吗?还是我错过了什么?请帮助我。注意:我在应用程序节点中使用通过身份验证

标签: websocket signalr iis-8 signalr.client arr


【解决方案1】:

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

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

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

此外,您需要确保每个服务器中的应用程序使用相同的身份。例如,选择您的应用程序节点(或站点节点,如果是这种情况),在右侧菜单中选择 Basic Settings,然后选择 Connect as...。如果选择的选项是应用程序用户,那么您需要检查您的应用程序池是如何配置的。如果它使用网络服务(和我的一样),您仍然会遇到问题,因为每个服务器都使用自己的凭据,但您必须确保它们使用相同的身份。

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

【讨论】:

  • 谢谢艾莉森。我会试试这个,让你知道
  • 嗨@Alisson,它工作正常,此后我再也没有收到任何套接字错误。感谢您提供此信息。但是我需要澄清一件事,在实现机器密钥更改后的服务器场中,每当我点击 url 时,onconnected 发生在一台服务器上,而集线器方法调用发生在另一台服务器上。这是路由中的程序吗?还是我错过了什么?请帮助我。注意:我在应用程序节点中使用通过身份验证
  • 对我的评论有任何想法吗?
  • @Suresh 哦,我忘了,对不起。在默认配置中,IIS 将每个请求平均分配给服务器。因此,第一个请求发送到服务器 A,下一个请求发送到服务器 B,然后再次发送到 A,依此类推。当您连接到 SignalR 时,实际上 IIS 正在接收请求,并且连接将被转发到其中一台服务器。当你调用一个集线器方法时,它转到另一个服务器是正常的。如果再次调用它,它应该转到下一个服务器,依此类推。所以发生在你身上的是预期的行为。
  • 每次我尝试循环负载平衡时,都会收到此脚本警告“[弃用] 主线程上的同步 XMLHttpRequest 已被弃用,因为它对最终用户的体验产生不利影响。如需更多帮助,请查看xhr.spec.whatwg.org。对此有想法吗?
【解决方案2】:

除了@Alisson 的回答,我还发现了一种设置Machine Key 的简单方法。

您可以直接在 Web.config 文件中进行此设置。 只需在 system.web 部分下为 ma​​chineKey 创建一个条目。 条目看起来像

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

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

通过使用这种方法,您无需担心在任何时候更改服务器或在任何其他网络场服务器上进行部署。您的代码将毫无问题地运行。

【讨论】:

  • 您知道吗,如上所述,我是否需要“取消选中为每个应用程序生成唯一密钥选项,用于验证密钥和解密密钥”?或者将您的配置添加到配置文件中就足够了吗?
  • 可以,在配置文件中添加配置即可。
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 2017-06-16
  • 2011-04-21
  • 1970-01-01
  • 2017-09-21
  • 2014-04-18
  • 2011-04-15
  • 2011-02-11
相关资源
最近更新 更多