我们使用Blazor和SignalR在客户端和服务器之间创建一个WebSocket连接。在所有系统上,我们看到每隔30秒就会有一个错误记录到控制台:
This_console_error:7失败:Microsoft.AspNetCore.SignalR.Client.HubConnection[69]由于错误,HubConnection正在重新连接。System.TimeoutException:服务器超时(30000.00ms)已过,但未收到来自服务器的消息。_bound_js_globalThis_console_err
我们在客户端设置连接如下:
HubConnection hubConnection = new HubConnectionBuilder()
.WithUrl(navigationManager.ToAbsoluteUri(HubConstants.TransportPackages),
options => {
options.AccessTokenProvider = () => Task.FromResult(authenticationService?.User?.Token);
options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransportType.WebSockets | Microsoft.AspNetCore.Http.Connections.HttpTransportType.ServerSentEvents | Microsoft.AspNetCore.Http.Connections.HttpTransportType.LongPolling;
})
.ConfigureLogging(logging => {
logging.AddProvider(loggerProvider);
})
.WithAutomaticReconnect()
.Build();
hubConnection.On(HubConstants.ReceiveTransportPackage, handler);
await hubConnection.StartAsync();
如果我们删除“.WithAutomaticReconnect()”,则错误消息会有所不同:
失败:Microsoft.AspNetCore.SignalR.Client.HubConnection[12]由于错误,连接正在关闭。System.TimeoutException:服务器超时(30000.00ms)已过,但未收到来自服务器的消息。
它看起来像是因为超时设置而记录了错误(在服务器上?)。但为什么它被记录为错误?这是故意的还是我们做错了什么?
我们知道,如果删除“logging.AddProvider(loggerProvider);“错误将不再被记录,但我们仍然希望有其他日志消息。
1条答案
按热度按时间8qgya5xd1#
我找到问题了。问题是服务器是这样配置的:
默认情况下,在客户机上,HubConnection.ServerTimeout设置为30。在服务器上将KeepAliveInterval设置为15秒(实际上是默认值)后,它现在可以像魔法一样工作,没有错误日志和重新连接。
因此,由于服务器上的KeepAliveInterval高于客户端上配置的ServerTimeout,因此始终存在超时,并且连接因异常而关闭。由于在我们的应用程序中,客户端只接收,但从不发送,因此连接的存活时间永远不会足够长。由于我们使用了自动重新连接,所以它最终仍然有效。但这并不理想,导致了大量的重新连接和日志消息。