【发布时间】:2022-04-11 18:32:26
【问题描述】:
我了解,如果连接因任何原因失败,SignalR 会不断尝试重新连接。测试我的服务器和客户端对此的响应的最佳方法是什么?
【问题讨论】:
我了解,如果连接因任何原因失败,SignalR 会不断尝试重新连接。测试我的服务器和客户端对此的响应的最佳方法是什么?
【问题讨论】:
为了让客户端尝试重新连接,您需要使用withAutomaticReconnect 方法配置HubConnectionBuilder。 JavaScript 代码如下所示:
const connection = new signalR.HubConnectionBuilder()
.withUrl(`${apiUrl}/subscribe/change`)
.withAutomaticReconnect()
.build();
一旦设置好,客户端将在连接丢失时尝试重新连接。
在内部,当 SignalR 断开连接时,它会调用 stopInternal 函数。
如果您想进行一些手动测试以确保您的处理程序被解雇并且他们会按照您的期望进行操作。您可以将连接保存在 const 中并自己触发事件。
我做了什么:
window 对象中。 window.signalR = connection;
Network conditions。Network throttling 更新为离线。signalR.connection.stopInternal();
我的onreconnecting 处理程序开始触发。它默认运行 4 次。它看起来像这样:
connection.onreconnecting(error => {
console.log('Reconnecting interval', error);
});
注意:此策略仅用于开发和一些手动测试。我不建议将window 对象用于单元测试或集成测试。
类似的策略可以通过在单元测试使用的一些内部变量上缓存连接来实现。
【讨论】:
我在这里找到了解决方案:https://stackoverflow.com/a/59916046/2929675
在打开 WebSocket 连接之前,您必须执行此脚本来猴子修补浏览器的 WebSocket 功能:
const sockets = [];
const nativeWebSocket = window.WebSocket;
window.WebSocket = function(...args){
const socket = new nativeWebSocket(...args);
sockets.push(socket);
return socket;
};
现在您可以通过 sockets 数组访问所有 WebSocket 连接。 而当你想触发重连时,你可以调用
sockets[0].close();
使用要关闭的连接的索引。
启用 SignalR 自动重新连接后,它将自动尝试打开新连接,并触发 Reconnecting 和 Reconnected 事件。
这有点hacky,但这是我迄今为止找到的最佳解决方案。
看起来铬问题也有一些进展,以在开发工具中支持这一点:https://bugs.chromium.org/p/chromium/issues/detail?id=423246
【讨论】:
在服务器上测试断开连接:浏览到另一个页面。
在客户端测试断开连接:重置服务器(IISreset?)。
【讨论】:
为 TypeScript 更新了 berhir 的 sn-p
class MockWebSocket extends WebSocket {
static sockets: WebSocket[] = [];
constructor(url: string | URL, protocols?: string | string[]) {
super(url, protocols);
MockWebSocket.sockets.push(this);
}
}
window.WebSocket = MockWebSocket;
关闭一个套接字:
MockWebSocket.sockets[index].close();
【讨论】: