ASP.NET Core SignalR 客户端与服务端自动重连配置指南
客户端配置(C#)
-
基础重连策略
使用
HubConnectionBuilder的WithAutomaticReconnect方法:csharpvar connection = new HubConnectionBuilder() .WithUrl("http://localhost:5000/chathub") .WithAutomaticReconnect() // 默认重试4次:0s、2s、10s、30s后停止 .Build(); -
自定义重连间隔
通过时间数组精确控制重试间隔:
csharp.WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(10), TimeSpan.FromSeconds(30) }) -
高级策略(IRetryPolicy)
实现
IRetryPolicy接口自定义逻辑:csharppublic class CustomRetryPolicy : IRetryPolicy { public TimeSpan? NextRetryDelay(RetryContext context) { if (context.PreviousRetryCount < 3) return TimeSpan.FromSeconds(Math.Pow(2, context.PreviousRetryCount)); return null; // 超过3次停止重连 } } // 应用策略 .WithAutomaticReconnect(new CustomRetryPolicy())
服务端配置
服务端通过超时参数间接影响客户端重连行为:
csharp
services.AddSignalR(options =>
{
options.ClientTimeoutInterval = TimeSpan.FromSeconds(60); // 客户端无响应超时(默认30s)
options.KeepAliveInterval = TimeSpan.FromSeconds(15); // 心跳间隔(默认15s)
options.HandshakeTimeout = TimeSpan.FromSeconds(15); // 握手超时(默认15s)
});
关键区别与注意事项
- 客户端主导:重连次数和间隔由客户端策略决定,服务端仅通过超时参数触发客户端重连。
- 状态监听:客户端可通过事件处理连接状态:
csharp
_connection.Reconnecting += connectionId => {
//重连中...
Debug.Assert(_connection.State == HubConnectionState.Reconnecting);
//通知用户连接已断开,客户端正在重新连接。
//开始排队或丢弃消息。
return Task.CompletedTask;
};
_connection.Reconnected += connectionId =>
{
//重连成功
return Task.CompletedTask;
};
_connection.Closed += error =>
{
//所有重连失败
Debug.Assert(_connection.State == HubConnectionState.Disconnected);
//通知用户连接已关闭,或手动尝试重新启动连接。
return Task.CompletedTask;
};
- 服务端超时联动 :若服务端
ClientTimeoutInterval设为60秒,客户端需在60秒内响应,否则服务端标记断开,触发客户端重连。
配置建议
- 客户端:根据业务需求选择固定间隔数组或动态策略(如指数退避)。
- 服务端 :合理设置超时避免误判(如
ClientTimeoutInterval建议为KeepAliveInterval的2倍)。 - 分布式场景 :结合Redis Backplane实现跨服务器消息同步(需安装
Microsoft.AspNetCore.SignalR.StackExchangeRedis包)。
参考权威来源: