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

Я создал 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.

1 Ответ

1 голос
/ 02 апреля 2020

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

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

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);
      });
  }
...