【问题标题】:SignalR - Change server timeout responseSignalR - 更改服务器超时响应
【发布时间】:2020-04-22 11:16:00
【问题描述】:

我已经创建了一个 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);
     }
}

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

【问题讨论】:

  • 您是否在客户端使用自动重新连接?

标签: c# azure asp.net-core signalr


【解决方案1】:

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

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

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

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

connection.serverTimeoutInMilliseconds = 120000;

测试结果

注意:

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

hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(2);
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);

【讨论】:

  • 关于此线程的任何更新?你@DylanGrijalva 解决了这个问题吗?
  • 你在哪里创建新的 HubConnectionBuilder 对象?
  • @orangecaterpillar 它可以在您需要时创建,但这在很大程度上取决于您的工作
【解决方案2】:

configuring server options请参考官方文档

您可以尝试如下配置:

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,因为在documentation 中您可以看到这些间隔以秒为单位。

    所以我现在的配置代码是这样的:

    /// <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;
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多