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 包)。

参考权威来源:

相关推荐
heimeiyingwang1 小时前
【架构实战】数据脱敏与隐私保护:合规是底线
java·开发语言·架构
于指尖飞舞1 小时前
java后端面试题(常用集合极简)
java·开发语言·面试
稷下元歌1 小时前
python核心基础,这关于基于Moveltg加 Ros2实战Python编程基础实课
开发语言·python
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第114题】【并发篇】第14题:说一下悲观锁的优点和缺点?
java·开发语言·面试
盒马盒马2 小时前
Rust:Vec
开发语言·rust
devilnumber2 小时前
Java 迭代器(Iterator)完全指南:从入门到实战
java·开发语言·迭代器
罗超驿2 小时前
13.Java多线程进阶:手动实现线程池与定时器机制详解
开发语言·面试·javaee
弹简特2 小时前
【Java项目-轻聊】10-实现会话管理模块
java·开发语言·数据库
人道领域2 小时前
Java后端开发者转型AIAgent开发路线指南
java·开发语言
许彰午2 小时前
35_Java设计模式之工厂模式
java·开发语言·设计模式