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



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

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

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

我正在使用signalR3.0,并有一个.net核心控制台应用程序作为客户端。

之所以会发生这种情况,是因为当您停止服务器时,它会发送服务器停止连接的事件。因此,这不是由客户端或网络造成的连接丢失,因此没有重新连接的意义,因为这是一个"故障";有目的的";连接端。

所以,若您在打开服务器时仍想重新连接,那个么您需要自己实现它。当服务器断开连接时,您会发现错误,可以尝试再次连接。参见此示例:

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

最新更新