.NET6读取AWS参数存储配置Get<T>方法始终返回null问题
.NET 配置体系的Get<T>()绑定逻辑不会自动将配置节点的字符串值解析为JSON反序列化,它只会读取当前节点下与目标类型属性名匹配的子节点完成赋值。
你当前将完整JSON作为单个字符串存入/SampleApi/BasicAuthOptions参数时,AWS Systems Manager配置提供程序加载后,该配置节点仅存在Value属性(即你存入的整段JSON字符串),不存在AccessKey、AccessSecret两个子节点,因此绑定返回null。
而在appsettings.json中编写同结构配置时,JSON配置提供程序会在加载阶段直接将JSON结构解析为层级化的配置节点,BasicAuthOptions节点下天然存在对应属性的子节点,因此绑定可以正常执行,这就是两种场景表现不一致的核心原因。
你可以根据自己的使用场景二选一:
方案1:按层级拆分存储参数(官方推荐)
AWS Parameter Store本身使用/作为路径分隔符,加载时会自动映射为.NET配置的:层级分隔符,你不需要存储整段JSON,将每个配置项拆分为独立参数即可:
- 参数键:
/SampleApi/BasicAuthOptions/AccessKey,参数值:develop - 参数键:
/SampleApi/BasicAuthOptions/AccessSecret,参数值:9a55w0rd123
拆分存储后,配置提供程序会自动生成符合绑定要求的层级节点,直接调用Get<BasicAuthOptions>()即可正常完成绑定,同时也支持单独修改单个配置项、多环境配置覆盖、细粒度权限控制等参数存储的原生能力。
方案2:保留整段JSON存储,开启自动解析
如果因为配置项过多、兼容现有逻辑等原因需要保留整段JSON作为单个参数值的存储方式,只需要在添加参数存储配置源时开启JSON值自动解析选项即可,配置代码如下:
webApplicationBuilder.Configuration.AddSystemsManager(config => { config.Path = "/SampleApi/"; config.ParseJsonValues = true; });
开启该选项后,配置提供程序在加载参数时,会自动尝试将字符串类型的参数值解析为JSON结构,挂载为对应配置节点的子节点,后续即可正常使用Get<T>()完成绑定。
你当前使用JsonSerializer.Deserialize直接读取节点Value反序列化的方式虽然可以拿到结果,但绕开了.NET配置系统的统一绑定逻辑,后续在使用配置热更新、多来源配置覆盖、配置校验等内置能力时会出现兼容问题,不建议在生产环境长期使用。
内容的提问来源于stack exchange,提问作者shukebeta

