c# ASP.NET Core SignalR 客户端与服务端自动重连配置指南

ASP.NET Core SignalR 客户端与服务端自动重连配置指南

客户端配置(C#)
  1. 基础重连策略

    使用 HubConnectionBuilderWithAutomaticReconnect 方法:

    csharp 复制代码
    var connection = new HubConnectionBuilder()
        .WithUrl("http://localhost:5000/chathub")
        .WithAutomaticReconnect() // 默认重试4次:0s、2s、10s、30s后停止
        .Build();
  2. 自定义重连间隔

    通过时间数组精确控制重试间隔:

    csharp 复制代码
    .WithAutomaticReconnect(new[] { 
        TimeSpan.Zero, 
        TimeSpan.FromSeconds(2), 
        TimeSpan.FromSeconds(10), 
        TimeSpan.FromSeconds(30) 
    })
  3. 高级策略(IRetryPolicy)

    实现 IRetryPolicy 接口自定义逻辑:

    csharp 复制代码
    public 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 包)。

参考权威来源:

相关推荐
好家伙VCC几秒前
**发散创新:基于Python与ROS的机器人运动控制实战解析**在现代机器人系统开发中,**运动控制**是实现智能行为的核心
java·开发语言·python·机器人
2401_82749999几秒前
python项目实战09-AI智能伴侣(ai_partner_2-3)
开发语言·python
派葛穆3 分钟前
汇川PLC-Python与汇川easy521plc进行Modbustcp通讯
开发语言·python
lzhdim43 分钟前
SharpCompress:跨平台的 C# 压缩与解压库
开发语言·c#
嘿嘿嘿x31 小时前
Linux记录过程
linux·开发语言
默 语1 小时前
Records、Sealed Classes这些新特性:Java真的变简单了吗?
java·开发语言·python
止观止1 小时前
拥抱 ESNext:从 TC39 提案到生产环境中的现代 JS
开发语言·javascript·ecmascript·esnext
卷心菜狗1 小时前
Python进阶-深浅拷贝辨析
开发语言·python
时寒的笔记1 小时前
js逆向7_案例惠nong网
android·开发语言·javascript
Evand J1 小时前
【MATLAB例程】基于低精度IMU、GNSS的UAV初始航向(三维角度)校准的仿真,包含卡尔曼滤波、惯导解算与校正
开发语言·matlab·gnss·imu·卡尔曼滤波