我了解如果连接因任何原因失败,SignalR 会不断尝试重新连接。测试我的服务器和客户端对此响应的最佳方法是什么?
3 回答
为了让客户端尝试重新连接,您需要使用withAutomaticReconnect方法配置HubConnectionBuilder。JavaScript 代码如下所示:
const connection = new signalR.HubConnectionBuilder()
.withUrl(`${apiUrl}/subscribe/change`)
.withAutomaticReconnect()
.build();
一旦设置好,客户端将在连接丢失时尝试重新连接。
在内部,当 SignalR 断开连接时,它会调用该stopInternal
函数。
如果您想进行一些手动测试以确保您的处理程序被解雇并且他们会按照您的期望进行操作。您可以将连接保存在 a 中const
并自己触发事件。
我做了什么:
- 像上面的代码一样创建连接,
- 缓存
window
对象中的连接。
window.signalR = connection;
- 打开浏览器控制台,单击左侧的三个点并导航到
Network conditions
.
- 更新
Network throttling
为离线。
- 最后跑了:
signalR.connection.stopInternal();
我的onreconnecting
处理程序开始射击。它默认运行 4 次。它看起来像这样:
connection.onreconnecting(error => {
console.log('Reconnecting interval', error);
});
注意:此策略仅用于开发和一些手动测试。我不建议将该window
对象用于单元测试或集成测试。
通过将连接缓存在单元测试要使用的一些内部变量上,可以实现类似的策略。
要在服务器上测试断开连接:浏览到另一个页面。
要在客户端上测试断开连接:重置服务器(IISreset?)。
我在这里找到了解决方案: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
andReconnected
事件。
这有点hacky,但这是我迄今为止找到的最好的解决方案。
看起来铬问题也有一些进展,以在开发工具中支持这一点:https ://bugs.chromium.org/p/chromium/issues/detail?id=423246