服务器关闭或重新启动时,SignalR客户端不会调用重新连接事件

时间:2020-04-02 10:16:53

标签: c# .net-core signalr signalr-client

我创建了hubConnection,并添加了.WithAutomaticReconnect(),因此当连接丢失时,它将自动重新连接。测试时,我编写了.Reconnecting事件,当我停止服务器时,客户端signalR连接将立即处于Disconnected状态,进入Closed事件而不进入Reconnecting事件,并且不会重新连接。只有当我停止服务器时,如果服务器没有停止,并且连接以某种方式丢失,它确实会尝试重新连接,并且会进入重新连接事件。那么,为什么在我停止服务器时未触发重新连接事件? 我问这是因为我想确保即使在进行一些更新后重新启动服务器,客户端也将重新连接。仅使用.WithAutomaticReconnect()方法,如果重新启动服务器,则客户端不会重新连接。

这是我的signalR连接构建代码:

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

我正在使用signalR 3.0,并具有.net核心控制台应用程序作为客户端。

1 个答案:

答案 0 :(得分: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);
      });
  }