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

参考权威来源:

相关推荐
ejinxian2 小时前
ASP.NET Core 10
后端·asp.net·core 10
Scout-leaf2 小时前
九成九新自用C#入门文档
c#
@老蝴3 小时前
Java EE - 常见的死锁和解决方法
java·开发语言·java-ee
AI_56784 小时前
接口测试“零基础通关“:Postman从入门到自动化测试实战指南
开发语言·lua
是Yu欸5 小时前
Rust 并发实战:从零构建一个内存安全的“番茄时钟”
开发语言·安全·rust
烛阴5 小时前
隐式vs显式:解密C#类型转换的底层逻辑
前端·c#
应用市场5 小时前
Qt QTreeView深度解析:从原理到实战应用
开发语言·数据库·qt
梦里不知身是客115 小时前
kafka作为Sink
c#·linq
猿来是你_L5 小时前
C# Dictionary 转换成 List
windows·c#·list