IIS AppPool 回收后 Signalr 永远重新连接

Signalr reconnects forever after IIS AppPool recycles

我正在使用 signalR 2.2.1。 当 IIS apppool 回收时,如果有一个打开的连接,客户端将永远尝试重新连接(使用相同的 ConnectionId)。

SignalR 客户端日志示例(针对每次重新连接尝试):

SignalR: webSockets reconnecting.

SignalR: Connecting to websocket endpoint 'wss://IP/hub/signalr/reconnect?transport=webSockets&groupsToken=8FWHT%2FO774vZYA7IYz8%2F%2FX9zMLswzG98KhGbM83kK5xh%2BVVbqQPv1wQYQWvzTygSQHj9QsDyoHL1U8eQ1fV18QQQ%2FZqRewQEpU4rkRZRE0CE%2B2oDk9RQghCT%2BxlV0KFcl%2FUpuepwX0E5w4xhSScH%2BFkxFvL4vtPIpwYVzInIaW%2BICRWRHrNfjKm9RLiC3a%2F3jcYi1AUeFBJsDnY%2F9bZBrA%3D%3D&messageId=d-C69C65D6-H%2C0%7CI%2C0%7CJ%2C4%7CK%2C0%7CL%2C0%7CM%2C0&clientProtocol=1.5&connectionToken=%2FivgB%2Bcy%2FE1%2B%2BTFj5eCqTEZNzr%2FVuIzdJQVbUypK1YjrZur80uPbufYxGT%2BDC%2FWhsHXZJgUpkI2IyJ8Y8wnuOEAID%2F9kOnSyllFpCQHDN6VRTdMEaU%2F0Kdh4yX2vqKh%2F&connectionData=%5B%7B%22name%22%3A%22hub%22%7D%5D&tid=0'.

SignalR: Closing the Websocket.

SignalR: Websocket opened.

SignalR: Unclean disconnect from websocket: [no reason given].

我做了一个解决方法 - 当调用重新连接的回调时 - 停止和启动连接(只是启动不起作用):

    $.connection.hub.reconnected(function() {
        console.log("reconnected");
        $.connection.hub.stop();
        $.connection.hub.start();
    });

但是我正在处理重新连接,我想这不是一个好主意。

还有其他想法吗?

经过上面评论中的一系列诊断尝试:

尝试在 Hub 中注释掉 OnReconnect 方法。作为一般规则,我不建议覆盖 onReconnect - 您需要它的真正原因很少,我能想到的唯一原因可能是重新连接的服务器端日志记录。

在 Signalr 连接的生命周期中,重新连接通常发生在 SignalR 恢复且没有任何消息丢失时 - 在这种情况下,您实际上不需要执行任何操作。还有一些其他情况可能会发生重新连接并且您需要某种恢复,但它们主要是我不推荐的 SignalR 架构(两个节点共享相同的 URL 和机器密钥,但在不同的背板上).