【发布时间】: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