You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:14:49