首页 > 解决方案 > 服务器重新启动时自动重新连接 SignalR 客户端

问题描述

我在 ASP.NET Boilerplate 项目中使用 ASP.NET Core SignalR,并且在服务器启动时一切正常。

但是出于任何需要重新启动服务器的原因,我看到了以下错误:

在此处输入图像描述

我必须刷新我的网页才能重新连接到 SignalR。

有没有办法检查服务器并重新连接而不刷新?

我使用 Angular 模板和 ABP v4.0.1 附带的默认 SignalR 客户端。

标签: angularasp.net-coreaspnetboilerplateasp.net-core-signalr

解决方案


这已在模板的 v5.1.1 中修复:aspnetboilerplate/module-zero-core-template#498

重新连接循环

yarn upgrade abp-web-resources@^4.1.0

在 abp-web-resources@4.1.0 中提供了重新连接循环:

// Reconnect loop
function start() {
    connection.start().catch(function () {
        setTimeout(function () {
            start();
        }, 5000);
    });
}

// Reconnect if hub disconnects
connection.onclose(function (e) {
    if (e) {
        abp.log.debug('Connection closed with error: ' + e);
    } else {
        abp.log.debug('Disconnected');
    }

    // if (!abp.signalr.autoConnect) {
    if (!abp.signalr.autoReconnect) {
        return;
    }

    // setTimeout(function () {
    //     connection.start();
    // }, 5000);
    start();
});

参考:

重新连接回路 + 断路器

yarn upgrade abp-web-resources@^5.1.1

断路器在 abp-web-resources@5.1.1 中可用:

// Reconnect loop
function tryReconnect() {
    if (tries > abp.signalr.maxTries) {
        return;
    } else {
        connection.start()
            .then(() => {
                reconnectTime = abp.signalr.reconnectTime;
                tries = 1;
                console.log('Reconnected to SignalR server!');
            }).catch(() => {
                tries += 1;
                reconnectTime *= 2;
                setTimeout(() => tryReconnect(), reconnectTime);
            });
    }
}

// Reconnect if hub disconnects
connection.onclose(function (e) {
    if (e) {
        abp.log.debug('Connection closed with error: ' + e);
    } else {
        abp.log.debug('Disconnected');
    }

    if (!abp.signalr.autoReconnect) {
        return;
    }

    // start();
    tryReconnect();
});

参考:


推荐阅读