SignalR - 更改服务器超时响应

Dyl*_*lan 8 c# azure signalr asp.net-core

我已经创建了一个 SignalR 应用程序,但是当我在集线器配置中设置 KeepAliveInternal 和 ClientTimeOutInterval 一个值时,应用程序会忽略它并始终将两者都设置为“30,000ms”。这是我的代码:

 public void ConfigureServices(IServiceCollection services)
 {
     services.AddRazorPages();
     services.AddSignalR().AddHubOptions<ActivityHub>(SetConfig);

     // Local function to set hub configuration
     void SetConfig(HubOptions<ActivityHub> options)
     {
         options.ClientTimeoutInterval = TimeSpan.FromMinutes(30);
         options.KeepAliveInterval = TimeSpan.FromMinutes(15);
     }
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读了 SignalR Net Core 文档,这两个属性没有限制。超时总是“30,000”,即使我将它们设置为不同的值。

Fei*_*Han 9

当我在集线器配置中设置 KeepAliveInternal 和 ClientTimeOutInterval 值时,应用程序会忽略它并始终将两者设置为“30,000ms”。

对于 SignalR JavaScript 客户端,默认serverTimeoutInMilliseconds值为 30,000 毫秒(30 秒)。如果您设置KeepAliveIntervalHubOptions 的值 > 30 秒,但未serverTimeoutInMilliseconds在客户端指定适当的 HubConnection 值,则连接将终止并出现错误,如下所示。

在此输入图像描述

要修复它,您可以尝试设置serverTimeoutInMillisecondsHubConnection,如下所示。

var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub")
    .configureLogging(signalR.LogLevel.Trace)
    .build();

connection.serverTimeoutInMilliseconds = 120000;
Run Code Online (Sandbox Code Playgroud)

测试结果

在此输入图像描述

笔记:

在上面的测试中,我使用以下代码片段配置 SignalR 集线器,我们可以发现每 60 秒自动发送一条 ping 消息。

hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(2);
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
Run Code Online (Sandbox Code Playgroud)


Jac*_*Jia 5

配置服务器选项请参考官方文档

您可以尝试如下配置:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(30);
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(15);
    });
}
Run Code Online (Sandbox Code Playgroud)

或者对于单个集线器:

services.AddSignalR().AddHubOptions<MyHub>(options =>
{
    options.ClientTimeoutInterval = TimeSpan.FromMinutes(30);
    options.KeepAliveInterval = TimeSpan.FromMinutes(15);
});
Run Code Online (Sandbox Code Playgroud)