我们使用Blazor和SignalR在客户端和服务器之间创建WebSocket连接.在所有系统上,我们看到每隔30秒就会有一个错误记录到控制台:

THIS_CONSOLE_ERROR:7失败: Microsoft.AspNetCore.SignalR.Client.HubConnection[69] 由于出现错误,HubConnection正在重新连接.服务器超时(30000.00ms),没有 从服务器接收消息. _bound_js_global这是控制台错误

我们在客户端设置连接,如下所示:

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] 由于出现错误,连接正在关闭.服务器超时(30000.00ms),没有 从服务器接收消息.

由于超时设置(在服务器上?),错误似乎已被记录.但是为什么它被记录为错误呢?这是故意的,还是我们做错了什么?

我们知道,如果删除"logging.AddProvider(LoggerProvider);",错误将不再被记录,但我们仍然希望有其他日志(log)消息.

推荐答案

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

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

默认情况下,客户端上的HubConnection.ServerTimeout设置为30.在服务器上将KeepAliveInterval设置为15秒(实际上是默认设置)后,它现在可以像咒语一样工作,没有错误日志(log)和重新连接.

因此,由于服务器上的KeepAliveInterval高于客户端上配置的ServerTimeout,因此始终存在超时,并且连接因异常而关闭.由于在我们的应用程序中,客户端只接收而不发送,因此连接从未保持足够长的活动时间. 因为我们使用的是自动重新连接,所以它最终还是有效的.但这并不理想,导致了大量的重新连接和日志(log)消息.

Csharp相关问答推荐

如何使用Microsoft Curve API从搜索的文件中获取内容(文本)?

VB.Net的SON模式导致集合代码不工作

通过EFCore上传大量数据.

C#方法从AJAX调用接收NULL

如何将不同类型的扩展参数的javascript函数转换成C#风格?

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

如何在页面重新加载后保持菜单切换状态

为什么EventInfo.EventHandlerType返回可为空的Type值?

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

CA1508:';NULL=>;TRUE;始终为';TRUE';.移除或重构条件(S)以避免死代码

正确处理嵌套的本机集合

将操作从编辑页重定向到带参数的索引页

为什么Docker中没有转发该端口?

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

如何在.NET MAUI中最大化GraphicsView的大小?

{ or ; expected error如何解决此问题

如何强制新设置在Unity中工作?

Autofac -动态实例化:手动传递构造函数

如何使用LINQ在C#中填充列表列表?

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较