ASP.NET Core 6迁移时无法正确读取appsettings.json多值配置问题
问题原因
一共三个核心问题导致绑定失败:
- 属性访问级别错误:C#中类的成员如果不写访问修饰符,默认是
private级别。.NET Core配置绑定器默认仅识别public类型的实例属性,你定义的List<SettingProperties> Settings、Set00、Set01等属性都是私有属性,绑定器根本无法识别这些属性,自然无法赋值。 - 数据结构不匹配:你当前appsettings.json中
Settings节点下是字符串键对应对象值的键值对结构,不是[]包裹的数组结构,直接用List<SettingProperties>无法承接这种非数组格式的配置。 - 配置注册逻辑和DI容器脱节:你手动实例化
Settings对象调用Bind方法的操作,和依赖注入容器完全无关。控制器注入IOptions<Settings>时,容器会生成全新的空Settings实例,根本不会用到你手动绑定的对象。
修复方法
根据你「子节点数量不固定、无法提前预知键名」的需求,不需要修改现有appsettings.json结构,按以下步骤调整即可:
- 修正选项类定义,用
Dictionary<string, SettingProperties>承接动态键值对配置,所有待绑定属性必须标记为public:
public class Settings { // 字典Key对应配置中子节点的键名(Set00、Set01等),Value对应节点的属性值 public Dictionary<string, SettingProperties> SettingItems { get; set; } = new(); } public class SettingProperties { public string Property1 { get; set; } public string Property2 { get; set; } public string Property3 { get; set; } }
如果你更习惯用
List结构接收配置,可以把appsettings.json中Settings节调整为数组格式,对应类中定义public List<SettingProperties> Settings {get;set;}即可正常绑定,但这种方式不适合你当前动态配置项的场景。
- 删除你之前手动new对象绑定的代码,改为通过DI容器的选项服务正确注册配置,在Program.cs中添加如下代码:
// 将Settings配置节的绑定关系注册到服务容器 builder.Services.Configure<Settings>(builder.Configuration.GetSection("Settings"));
注册完成后,控制器中通过IOptions<Settings>注入的实例就可以正常读取到所有配置值:通过SettingItems["Set00"]即可获取对应节点的配置,遍历字典的Keys属性即可拿到所有未知数量的配置子节点,不需要提前预知子节点数量和键名。
补充说明:你之前测试的固定属性版本,只要给Set00、Set01属性加上public修饰符,在键名完全匹配的场景下可以正常绑定,但这种硬编码属性的方式无法适配动态增减的配置项,不适合你的需求场景。
内容的提问来源于stack exchange,提问作者Nicola Agostoni
相关产品推荐
相关产品推荐

