websocket 每30秒发出一次信号R TimeOutException

quhf5bfb  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(224)

我们使用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);“错误将不再被记录,但我们仍然希望有其他日志消息。

8qgya5xd

8qgya5xd1#

我找到问题了。问题是服务器是这样配置的:

var signalRService = services.AddSignalR(o =>
                {
                    o.KeepAliveInterval = TimeSpan.FromSeconds(60);  
                });

默认情况下,在客户机上,HubConnection.ServerTimeout设置为30。在服务器上将KeepAliveInterval设置为15秒(实际上是默认值)后,它现在可以像魔法一样工作,没有错误日志和重新连接。
因此,由于服务器上的KeepAliveInterval高于客户端上配置的ServerTimeout,因此始终存在超时,并且连接因异常而关闭。由于在我们的应用程序中,客户端只接收,但从不发送,因此连接的存活时间永远不会足够长。由于我们使用了自动重新连接,所以它最终仍然有效。但这并不理想,导致了大量的重新连接和日志消息。

相关问题