据我所知,如果连接因任何原因失败,SignalR会不断尝试重新连接。测试我的服务器和客户端对此的响应的最佳方法是什么?
答案 0 :(得分:1)
为了使客户端尝试重新连接,您需要使用HubConnectionBuilder方法配置withAutomaticReconnect。 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
对象用于单元测试或集成测试。
可以通过将连接缓存在一些供单元测试使用的内部变量上来实现类似的策略。
答案 1 :(得分:0)
要测试服务器上的断开连接:浏览到另一个页面。
要测试客户端上的断开连接:重置服务器(IISreset?)。
答案 2 :(得分:0)
我在这里找到了解决方案:https://stackoverflow.com/a/59916046/2929675
在打开 WebSocket 连接之前,您必须执行此脚本来修补浏览器的 WebSocket 功能:
{
"compilerOptions": {
"strictBindCallApply": true,
"strictNullChecks": true
}
}
现在您可以通过 sockets 数组访问所有 WebSocket 连接。 当你想触发重新连接时,你可以调用
const sockets = [];
const nativeWebSocket = window.WebSocket;
window.WebSocket = function(...args){
const socket = new nativeWebSocket(...args);
sockets.push(socket);
return socket;
};
使用要关闭的连接的索引。
启用 SignalR 自动重新连接后,它会自动尝试打开新连接,并触发 sockets[0].close();
和 Reconnecting
事件。
这有点老套,但它是我目前找到的最好的解决方案。
看起来在 Chrome 问题上也有一些进展可以在开发工具中支持这一点:https://bugs.chromium.org/p/chromium/issues/detail?id=423246