读取appsettings.json配置节点报CS0120错误的解决方法
错误原因
CS0120错误的核心触发原因是:你在代码中调用Configuration.GetSection()时,当前作用域内不存在名为Configuration的可用对象实例,编译器会尝试查找静态的Configuration成员,找不到匹配签名的实现就会抛出该错误。
这个问题几乎都是.NET版本写法差异导致的:.NET 5及更早版本的项目通常使用Startup类完成服务注册,Configuration是Startup类通过构造函数注入得到的实例属性,在类内部方法中可以直接调用;但.NET 6及之后的默认项目模板改用顶级语句编写Program.cs,不存在全局静态的Configuration对象,直接裸写Configuration自然会触发编译错误。
修复方案
将服务注册代码中的Configuration替换为WebApplicationBuilder实例(即你代码中已经定义的builder对象)上挂载的Configuration属性即可,修正后的代码如下:
builder.Services.Configure<MailSettings>(builder.Configuration.GetSection("MailSettings"));
修复后即可正常编译,服务注册完成后,你可以在控制器、自定义服务类中通过IOptions<MailSettings>注入,获取绑定完成的强类型配置实例。
配置绑定校验
要保证配置值能正确映射到MailSettings类,需要确认appsettings.json中存在层级、名称匹配的MailSettings节点,参考结构如下:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "MailSettings": { "Mail": "noreply@yourdomain.com", "DisplayName": "系统通知", "Password": "your_email_smtp_password", "Host": "smtp.yourdomain.com", "Port": 465 }, "AllowedHosts": "*" }
配置绑定默认不区分大小写,但节点名、属性名拼写要保持一致,否则会出现对应属性绑定为空值的问题。
内容的提问来源于stack exchange,提问作者SylvainKrier
相关产品推荐
相关产品推荐

