SignalR - 更改服务器超时响应

11

我创建了一个SignalR应用程序,但是当我在hub配置中设置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);
     }
}
我已经阅读了SignalR Net Core文档,这两个属性没有限制。即使我将它们设置为不同的值,超时总是为“30,000”。

我已閱讀 SignalR Net Core 文件,這兩個屬性沒有限制。即使我將它們設置為不同的值,超時總是為“30,000”。


1
你在客户端使用自动重连吗? - Dennis VW
3个回答

8
当我在Hub配置中设置KeepAliveInternal和ClientTimeOutInterval的值时,应用程序会忽略它并始终将其设置为"30,000ms"。对于SignalR JavaScript客户端,默认的serverTimeoutInMilliseconds值为30,000毫秒(30秒)。如果您将HubOptions的KeepAliveInterval设置为大于30秒的值,但未在客户端的HubConnection中指定适当的serverTimeoutInMilliseconds值,则连接将以错误终止,如下所示。

enter image description here

为了解决这个问题,您可以尝试设置您的HubConnection的serverTimeoutInMilliseconds,如下所示。
var connection = new signalR.HubConnectionBuilder().withUrl("/chatHub")
    .configureLogging(signalR.LogLevel.Trace)
    .build();

connection.serverTimeoutInMilliseconds = 120000;

测试结果

enter image description here

注意:
在我的上述测试中,我使用以下代码片段配置了SignalR中心,我们可以发现每60秒自动发送一条ping消息。
hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(2);
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);

1
这个线程有任何更新吗?@DylanGrijalva 你解决了这个问题吗? - Fei Han
1
你在哪里创建新的HubConnectionBuilder对象? - orangecaterpillar
@orangecaterpillar 可以在需要时创建,但这已经很大程度上取决于您所做的事情。 - Dylan

5
请参考官方文档了解有关配置服务器选项的内容:配置服务器选项 您可以尝试按照以下方式进行配置:
public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(30);
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(15);
    });
}

或者对于单个集线器:

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

3
我之前也遇到了同样的问题,解决方法很简单。我将TimeSpan.FromMinutes改为TimeSpan.FromSeconds,因为在文档中可以看到这些时间间隔是以秒为单位的。

server config

所以我的配置代码现在是这样的:
/// <summary>
/// Adds SignalR.
/// </summary>
private void AddSignalR(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.ClientTimeoutInterval = TimeSpan.FromSeconds(this.azureConfiguration.SignalR.ClientTimeoutInterval);
        hubOptions.HandshakeTimeout = TimeSpan.FromSeconds(this.azureConfiguration.SignalR.HandshakeTimeout);
        hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(this.azureConfiguration.SignalR.KeepAliveInterval);
        hubOptions.EnableDetailedErrors = this.azureConfiguration.SignalR.EnableDetailedErrors;
        hubOptions.MaximumReceiveMessageSize = this.azureConfiguration.SignalR.MaximumReceiveMessageSize;
        hubOptions.StreamBufferCapacity = this.azureConfiguration.SignalR.StreamBufferCapacity;
    }).AddAzureSignalR(azureOptions =>
    {
        azureOptions.ConnectionCount = this.azureConfiguration.SignalR.ServerConnectionCount;
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接