Клиент SignalR не вызывает событие повторного подключения, когда сервер выключается или перезапускается

Я создал hubConnection и добавил.WithAutomaticReconnect(), поэтому, когда соединение будет потеряно, оно автоматически восстановится. При тестировании я написал событие.Reconnecting, и когда я останавливаю сервер, клиентское соединение signalR немедленно переходит в состояние Disconnected и в событие Closed, не переходя в событие Reconnecting, и не подключается повторно. Это происходит только тогда, когда я останавливаю сервер, если сервер не остановлен и соединение каким-то образом потеряно, он пытается восстановить соединение и переходит в событие Reconnecting. Итак, почему событие Reconnecting не запускается, когда я останавливаю сервер? Я спрашиваю об этом, потому что хочу убедиться, что клиент повторно подключится, даже если я перезапущу сервер после некоторых обновлений. При использовании только метода.WithAutomaticReconnect() клиент не подключается повторно, если сервер был перезапущен.

Это мой код для сборки подключения signalR:

_hubConnection = new HubConnectionBuilder().WithUrl(Url, options =>
                 {
                     options.AccessTokenProvider = () => Task.FromResult(token);
                 })
                .WithAutomaticReconnect()
                .Build();

Я работаю с signalR 3.0 и использую консольное приложение.NET core в качестве клиента.

1 ответ

Решение

Это происходит потому, что, когда вы останавливаете сервер, он отправляет событие, что сервер прервал соединение, поэтому это не потеря соединения, вызванная клиентом или сетью, поэтому нет смысла повторно подключаться, потому что это было "намеренное" завершение соединения.

Итак, если вы все еще хотите восстановить соединение при выключении сервера, вам необходимо реализовать это самостоятельно. Когда сервер отключится, вы поймете ошибку и сможете попытаться подключиться снова. См. Этот пример:

private async connectSignalR() {
    await this.hubMessageConnection.start()
        .then(() => {
        this.doSomething();
    }).catch(() => {
        this.onError.emit(WidgetStateEnum.connectionClose);
    });
}

private configureSignalR(signalRUrl: string, token: string) {
    this.hubMessageConnection = new signalR.HubConnectionBuilder()
    .configureLogging(signalR.LogLevel.Error).withUrl(signalRUrl + "/yourHubEndpoint",
    {
        accessTokenFactory: () => token
    })
    .withAutomaticReconnect()
    .build();

    this.hubMessageConnection.onclose(() => {
        this.connectionClose();
    });
}

private connectionClose() {
    this.onError.emit(WidgetStateEnum.connectionClose);
    this.doSomethingWhenConnectionIsClose();
}.catch(() => {
        this.onError.emit(WidgetStateEnum.connectionClosed);
      });
  }
Другие вопросы по тегам