.NET Core 6中ConfigurationBuilder加载appsettings.json非硬编码路径值异常
问题根源分析
- 重复创建
ConfigurationBuilder实例,在文件被频繁覆盖(如设置“始终复制”)时易引发文件读取锁冲突,导致交替出现读取失败的情况。 - 直接使用相对路径
"appsettings.json"依赖当前工作目录,但该目录不一定等于应用执行目录(比如IDE调试时工作目录是项目根目录,而非bin目录)。
稳定加载配置的解决方案
方案1:基于应用基目录构建配置路径
通过AppContext.BaseDirectory获取程序集所在的执行目录,拼接配置文件路径,确保指向正确位置,且只构建一次配置实例:
// 获取应用执行目录 var baseDir = AppContext.BaseDirectory; // 拼接配置文件绝对路径 var configPath = Path.Combine(baseDir, "appsettings.json"); // 一次性构建配置实例 var configuration = new ConfigurationBuilder() .AddJsonFile(configPath, optional: false, reloadOnChange: true) .Build(); // 读取配置项 string serverURL = configuration.GetSection("AppSettings")["DTS_url"]; string serverURL2 = configuration.GetSection("AppSettings").GetValue<string>("DTS_url");
方案2:利用.NET Core默认配置体系(推荐)
.NET Core 6框架已默认加载appsettings.json系列配置文件,通过依赖注入直接获取IConfiguration即可,无需手动重复构建:
1. 确认Program.cs默认配置加载(框架已自动处理)
var builder = WebApplication.CreateBuilder(args); // 框架已自动加载appsettings.json、appsettings.{Environment}.json等 // 如需额外配置可在此扩展,例如: // builder.Configuration.AddJsonFile("custom-config.json"); var app = builder.Build(); // 后续通过依赖注入使用配置
2. 在业务类中注入IConfiguration读取配置
public class YourBusinessService { private readonly IConfiguration _configuration; // 构造函数注入IConfiguration public YourBusinessService(IConfiguration configuration) { _configuration = configuration; } public void Execute() { // 直接读取配置 string dtsUrl = _configuration.GetSection("AppSettings")["DTS_url"]; // 推荐:使用强类型绑定更易维护 var appSettings = _configuration.GetSection("AppSettings").Get<AppSettings>(); string typedDtsUrl = appSettings.DTS_url; } } // 定义强类型配置类 public class AppSettings { public string DTS_url { get; set; } }
方案3:解决文件复制冲突的临时方案
若需保留手动构建逻辑,可调整文件复制选项并添加读取重试:
- 将appsettings.json的复制选项设为较新则复制,避免每次运行覆盖文件。
- 添加重试逻辑应对文件锁定场景:
IConfiguration BuildConfigurationWithRetry(int retryCount = 3) { int attempts = 0; while (attempts < retryCount) { try { return new ConfigurationBuilder() .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .Build(); } catch (IOException) { attempts++; Thread.Sleep(100); } } throw new InvalidOperationException("无法加载配置文件"); } // 使用重试逻辑构建配置 var configuration = BuildConfigurationWithRetry(); string serverURL2 = configuration.GetSection("AppSettings").GetValue<string>("DTS_url");
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

