appsettings.json没生效需查三件事:文件属性是否设为“复制到输出目录”、ConfigurationBuilder是否显式调用AddJsonFile、SetBasePath路径是否正确。

appsettings.json 文件没生效?先查三件事
不是加了文件就自动读取,IConfiguration 不会主动扫描项目目录。常见现象是 config["SomeKey"] 返回 null 或空字符串,但配置明明写对了。
- 文件属性里“复制到输出目录”必须设为
Copy always或Copy if newer—— 否则生成后根本不在bin/Debug下,AddJsonFile找不到它,静默跳过,不报错 -
ConfigurationBuilder必须显式调用AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)—— 不能靠Host.CreateDefaultBuilder()的默认行为来“猜”,手动构建时漏掉这步等于没加载 - 路径要对:
SetBasePath(Directory.GetCurrentDirectory())是常规做法;若用AppContext.BaseDirectory,注意它指向实际运行目录(如发布后的publish/),不是项目根目录
读嵌套键时用 GetValue 还是 GetSection?看层级和容错需求
比如读 "ConnectionStrings:Default",两种写法效果不同,容易混淆。
-
config.GetValue最直接,但键不存在或类型不匹配时返回("ConnectionStrings:Default") default(string)(即null),不会抛异常 —— 所以必须手动判空:if (connStr == null) throw new InvalidOperationException(...) -
config.GetSection("ConnectionStrings").GetSection("Default").GetValue更适合多级结构,但要注意:("ConnectionString") GetSection永远不返回null,哪怕路径完全不存在;所以后续的GetValue仍可能得null,不能省略空值检查 - 环境变量覆盖时,冒号要换成双下划线:
ConnectionStrings__Default,且优先级高于 JSON 文件 —— 测试时别只改 JSON,忘了清环境变量
绑定 POCO 类比拼字符串键更安全,但命名必须严格匹配
Get 绑定能避免手敲键名出错,也支持默认值和编译期检查,但坑在大小写和命名映射上。
- 配置键后缀必须与属性名**完全一致**,区分大小写:
"AppSettings:SiteName"对应public string SiteName { get; set; },写成siteName或Sitename都会绑定失败,值为默认值(如null或0) - 不支持自动驼峰转下划线、也不支持首字母小写转换 —— 即使 JSON 里是
"site_name",类里也得写public string site_name { get; set; } - 嵌套对象绑定时,节名就是路径前缀:
config.GetSection("Proxy").Get要求 JSON 里有() "Proxy": { "Address": "..." },对应public string Address { get; set; }
别碰 ConfigurationManager,它在 .NET 6+ 里已失效
硬加 System.Configuration 引用,编译能过,但运行时要么静默失败,要么抛 InvalidOperationException:“Configuration system failed to initialize”。
-
ConfigurationManager.AppSettings和ConfigurationManager.ConnectionStrings在 .NET Core / 5+ 中不工作 —— 它们依赖旧版 XML 配置系统,和IConfiguration完全无关 - 如果项目迁移自 .NET Framework,不要试图复用
app.config;统一改用appsettings.json+IConfiguration - 第三方库若内部调用
ConfigurationManager,需确认它是否提供 .NET Core 兼容版本;否则只能绕过或换库
配置系统真正复杂的地方不在语法,而在**多个源合并时的优先级顺序**和**热重载触发时机**——这两点不验证运行时行为,光看代码永远发现不了问题。











