ASP.NET Core 6读取appsettings.json配置返回null问题排查
问题根因
读取配置返回null由三个错误导致:
- 控制器中手动
new MyConfiguration()创建实例,该实例未经过配置绑定流程,属性全部为默认null值,和你在服务容器中注册的配置完全无关。 - 手动构建
ConfigurationBuilder加载配置属于冗余操作,ASP.NET Core 6默认已自动加载项目根目录的appsettings.json,手动构建时如果路径匹配错误反而会加载失败。 - 仅单独注册了
SectionA、SectionB的选项绑定,未对根配置类MyConfiguration做绑定,无法直接获取填充完成的MyConfiguration实例。
修复方案
1. 调整Program.cs配置注册逻辑
删除手动构建IConfigurationRoot的代码,直接使用框架默认初始化的builder.Configuration完成配置绑定:
// 绑定整个配置根节点到MyConfiguration类 builder.Services.Configure<MyConfiguration>(builder.Configuration); // 若业务中需要单独注入SectionA/SectionB实例可保留以下两行,无相关需求可删除 builder.Services.Configure<SectionA>(builder.Configuration.GetSection("SectionA")); builder.Services.Configure<SectionB>(builder.Configuration.GetSection("SectionB"));
注意:需要将项目中
appsettings.json的文件属性设置为「如果较新则复制」到输出目录,否则运行时会因找不到配置文件导致读取失败。
2. 修正控制器的依赖注入逻辑
不要手动实例化配置类,通过构造函数注入IOptions<MyConfiguration>获取绑定完成的配置实例,修正后的控制器代码:
public class WeatherForecastController : ControllerBase { private readonly MyConfiguration _configuration; // 构造函数注入配置选项 public WeatherForecastController(IOptions<MyConfiguration> configOptions) { _configuration = configOptions.Value; } [HttpGet(Name = "GetWeatherForecast")] public IActionResult Get() { // 此处可正常读取到配置值 var sectionAValue = _configuration.SectionA.SectionASubItem1; var sectionBValue = _configuration.SectionB.SectionBSubItem2; if (_configuration.SectionA == null) return BadRequest(); return Ok(); } }
如果业务逻辑只需要单独使用SectionA或SectionB,也可以直接注入IOptions<SectionA>/IOptions<SectionB>,不需要依赖MyConfiguration根类。
内容的提问来源于stack exchange,提问作者Saghar Francis
相关产品推荐
相关产品推荐

