Microsoft.Data.SqlClient配置中SqlConfigurableRetryLogic未生效问题求助
解决Microsoft.Data.SqlClient配置文件重试逻辑不生效的问题
一、配置文件的正确配置要点
- 配置文件位置:.NET 6 Web应用作为启动项目,重试逻辑配置必须放在Web项目的
App.config中(类库的App.config不会被读取),且需确保该文件的“复制到输出目录”属性设置为“始终复制”。 - 依赖包安装:Web项目需安装
System.Configuration.ConfigurationManagerNuGet包,因为.NET 6默认不包含传统配置节的读取能力。 - 配置节正确性校验:确认配置节的
type属性与使用的Microsoft.Data.SqlClient版本匹配,5.1.1版本的程序集名称为Microsoft.Data.SqlClient,你当前的配置代码语法无误。
二、验证配置是否被加载
在代码中手动读取配置节,确认配置是否被正确识别:
using System.Configuration; using Microsoft.Data.SqlClient; // 在应用初始化代码中添加 var connectionRetrySection = ConfigurationManager.GetSection("SqlConfigurableRetryLogicConnection") as SqlConfigurableRetryConnectionSection; if (connectionRetrySection != null) { // 输出配置信息,确认读取成功 Console.WriteLine($"重试方法:{connectionRetrySection.RetryMethod}"); Console.WriteLine($"重试次数:{connectionRetrySection.NumberOfTries}"); }
如果读取结果为null,说明配置文件未被正确加载,需检查文件路径、复制属性及配置节语法。
三、重试逻辑的有效测试方法
你当前的测试方法(数据库离线)无法触发默认重试逻辑,因为SqlClient的默认重试仅针对特定临时错误(如死锁、连接超时、错误码1205/4060等),数据库离线导致的“无法找到服务器”错误不在默认重试范围内。
有效测试方式:
- 手动触发数据库死锁,观察重试情况
- 设置较短的连接超时时间,模拟临时连接故障
- 自定义重试错误列表,包含数据库离线对应的错误码(如10060)
四、代码层面的全局配置方案
若配置文件方式始终不生效,可直接在代码中全局设置重试逻辑,无需依赖配置文件:
// 在Program.cs的应用启动代码中添加 using Microsoft.Data.SqlClient; // 全局设置连接重试(指数退避) SqlConnection.RetryLogicProvider = SqlConfigurableRetryFactory.CreateExponentialRetryProvider( new SqlRetryLogicOption { NumberOfTries = 5, DeltaTime = TimeSpan.FromSeconds(3), MaxTime = TimeSpan.FromSeconds(45) }); // 全局设置命令重试(增量退避) SqlCommand.RetryLogicProvider = SqlConfigurableRetryFactory.CreateIncrementalRetryProvider( new SqlRetryLogicOption { NumberOfTries = 4, DeltaTime = TimeSpan.FromSeconds(2), MaxTime = TimeSpan.FromSeconds(30) });
该方式直接覆盖默认重试逻辑,适用于.NET 6+应用,且Dapper操作会自动继承SqlConnection的重试配置。
内容的提问来源于stack exchange,提问作者user2997206
相关产品推荐
相关产品推荐

