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

参考权威来源:

相关推荐
灰子学技术20 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
二十雨辰20 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码20 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚20 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂20 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas13621 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript
bugcome_com21 小时前
零基础入门C#:一篇搞懂核心知识点
c#
琹箐21 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
Monly2121 小时前
Java:修改打包配置文件
java·开发语言
我命由我123451 天前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime