在SignalR中,是否可以模拟重新连接以进行测试?

时间:2013-01-30 15:53:49

标签: c# asp.net signalr

据我所知,如果连接因任何原因失败,SignalR会不断尝试重新连接。测试我的服务器和客户端对此的响应的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

为了使客户端尝试重新连接,您需要使用HubConnectionBuilder方法配置withAutomaticReconnect。 JavaScript代码如下所示:

const connection = new signalR.HubConnectionBuilder()
  .withUrl(`${apiUrl}/subscribe/change`)
  .withAutomaticReconnect()
  .build();

设置后,客户端将在连接断开时尝试重新连接。

在内部,当SignalR断开连接时,它将调用stopInternal函数。

如果您想进行一些手动测试,以确保您的处理程序被解雇,并且按照您的期望去做。您可以将连接保存在const中,然后自行触发事件。

我做了什么:

  1. 像上面的代码一样创建连接
  2. 将连接缓存在window对象中。
    window.signalR = connection;
  1. 打开浏览器控制台,单击左侧的三个点,然后导航到Network conditions

enter image description here

  1. 已将Network throttling更新为离线版本。

enter image description here

  1. 最后跑:
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