SignalR - 更改服务器超时响应
SignalR - Change server timeout response
我已经创建了一个 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”,即使我将它们设置为不同的值。
请参考官方文档
您可以尝试如下配置:
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);
});
when i set the KeepAliveInternal and ClientTimeOutInterval a value in the hub configuration, the application ignore it and always set to "30,000ms" for both.
对于 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;
测试结果
注:
在我上面的测试中,我使用以下代码片段配置 SignalR 集线器,我们可以发现每 60 秒自动发送一条 ping 消息。
hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(2);
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
我当年也有同样的问题,改的也很简单。我将 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;
});
}
我已经创建了一个 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”,即使我将它们设置为不同的值。
您可以尝试如下配置:
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);
});
when i set the KeepAliveInternal and ClientTimeOutInterval a value in the hub configuration, the application ignore it and always set to "30,000ms" for both.
对于 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;
测试结果
注:
在我上面的测试中,我使用以下代码片段配置 SignalR 集线器,我们可以发现每 60 秒自动发送一条 ping 消息。
hubOptions.ClientTimeoutInterval = TimeSpan.FromMinutes(2);
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
我当年也有同样的问题,改的也很简单。我将 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;
});
}