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

参考权威来源:

相关推荐
我不是疯子是傻子4 分钟前
Qt 实时曲线卡顿优化:从QPainter到OpenGL的3级加速实战
开发语言·qt
zlinear数据采集卡6 分钟前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
nnerddboy1 小时前
Rust教程04:引用、借用与切片
开发语言·后端·rust
jerryinwuhan1 小时前
《Python数据预处理》第四章
开发语言·python
长江&后浪1 小时前
防火墙的描述
开发语言·网络·php
观无2 小时前
若依EasyExcel实现单元格合并
开发语言·前端·javascript
雨晨源码(同名B站)2 小时前
基于Python的网易云音乐评论数据情感化分析系统 音乐爬虫信息可视化 |SnowNLP评论情感分析
开发语言·hadoop·爬虫·python·信息可视化·毕业设计
我不是疯子是傻子2 小时前
串口通信数据帧粘包拆包再进化:基于 Qt 的滑动窗口与 CRC 校验实战
开发语言·qt
程序员老陆2 小时前
Qt中实现窗口真全屏(覆盖Windows任务栏)
开发语言·windows·qt
霸道流氓气质2 小时前
Java中信号量(Semaphore):从本地到分布式
java·开发语言·分布式