【问题标题】:SignalR active/passive failover setupSignalR 主动/被动故障转移设置
【发布时间】:2018-09-14 03:14:36
【问题描述】:

我有两台 SignalR 服务器位于 HaProxy 负载均衡器后面,配置了主动/被动配置。

一次,所有请求都转发到一个节点。比方说,node1 是活动的,node2 是 hot&ready 但没有收到任何来自 LB 的流量,因为node1 在线。

当用户打开网页时,SignalR 客户端通过 LB 连接到 node1。假设我们有一个客户端连接到我们的服务器。

node1 出现故障时,HaProxy 将流量切换到node2,并且通过 SignalR 连接的客户端检测到连接已断开并尝试进行重新连接调用。尽管node2 已启动并正在运行,但客户端在重新连接时会收到如下错误:

WebSocket connection to 'ws://10.0.11.88:12000/signalr/reconnect?transport=webSockets&messageId=s-0%2C12A&clientProtocol=1.5&myparam1=1&myparam2=6&token=6372bdbd1ca64f06aa52362a6913bdd8&connectionToken=lxqeSwxAu756vF0TwhXCFzb0ZMHraRocsx7jS2A%2F%2Ben0vgtfI9Fid47oLiKg4KnX3E5eFKwwaezv4JSPbrsLr3C%2FmTGS8Ev3WLgAUZcbAjvlf9VHYsxbEcYV7Z09rHEH&connectionData=%5B%7B%22name%22%3A%22gamewindow%22%7D%5D&tid=7' failed: Error during WebSocket handshake: Unexpected response code: 400

在 Visual Studio 中探索输出时,我发现了以下错误日志:

SignalR.HubDispatcher Information: 0 : Failed to process connectionToken lxqeSwxAu756vF0TwhXCFzb0ZMHraRocsx7jS2A/+en0vgtfI9Fid47oLiKg4KnX3E5eFKwwaezv4JSPbrsLr3C/mTGS8Ev3WLgAUZcbAjvlf9VHYsxbEcYV7Z09rHEH: System.Security.Cryptography.CryptographicException: Error occurred during a cryptographic operation. at System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input) at Microsoft.AspNet.SignalR.Infrastructure.DataProtectionProviderProtectedData.Unprotect(String protectedValue, String purpose) at Microsoft.AspNet.SignalR.PersistentConnection.TryGetConnectionId(HostContext context, String connectionToken, String& connectionId, String& message, Int32& statusCode)

在重新连接尝试命中与客户端首先连接的同一台服务器的情况下,即使服务器应用程序完全重新启动,一切正常。

任何有关此错误的见解或有关如何为 SignalR 实施故障转移解决方案的一些最佳实践将不胜感激。

我也知道背板横向扩展方法,但我相信上面的问题也会出现。

【问题讨论】:

    标签: c# websocket signalr load-balancing failover


    【解决方案1】:

    经过一番研究,找到了解决办法。

    为什么我会得到 CryptographicException:SignalR 使用一些加密技术对 connectionId 进行安全处理。对于散列,它使用machineKey,默认情况下由 IIS 静默生成并在运行时注入web.config。所以我的两台服务器获得了两种不同的 machineKey 配置,这就是为什么 SignalR 客户端无法重新连接到 node2 但即使在重新启动后重新连接到 node1 也是成功的。

    修复是禁用 IIS 中的自动 machineKey 生成(IIS 管理器中有一个同名部分)并为两个节点提供相同的 machineKey 配置。完成此操作后,当 node1 断开连接时,SignalR 客户端重新连接到 node2 没有任何问题。

    还想提一下machineKey 是一组两个键,它不是随机字符串,并且有自己的格式。一旦你知道你需要,找出如何生成它应该不是问题:)

    【讨论】:

      猜你喜欢
      • 2016-03-12
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 2016-03-19
      • 1970-01-01
      • 2015-11-10
      • 2015-10-05
      相关资源
      最近更新 更多