App.config 的 appSettings 需通过 ConfigurationManager.AppSettings 读取,仅适用于 .NET Framework;.NET Core/5+ 应使用 appsettings.json 配合 ConfigurationBuilder 加载,注意文件复制属性、路径大小写及 IConfiguration 构建时机。

App.config 里 appSettings 怎么读取?
它只在 .NET Framework 项目中有效,.NET Core / .NET 5+ 默认不识别。如果项目是旧版 WinForms 或 WPF,ConfigurationManager.AppSettings 仍可用,但需手动加引用:System.Configuration 程序集。
常见错误现象:ConfigurationManager.AppSettings["Key"] 返回 null,多半是没在 App.config 的 <appsettings></appsettings> 节点下正确定义,或拼错 key 名(区分大小写)。
实操建议:
- 确认
App.config文件属性中 “复制到输出目录” 设为 “始终复制” - key 值不能含空格或特殊字符,推荐用驼峰命名,如
apiTimeout - 不要在类库项目中依赖
App.config—— 类库没有自己的配置上下文,会读取调用方的配置
appsettings.json 在 .NET 6+ 中怎么加载?
默认不自动加载,必须显式调用 ConfigurationBuilder 构建实例。新项目模板已内置,但自定义主机或控制台程序容易漏掉这步。
使用场景:Web 项目由 WebApplication.CreateBuilder() 自动完成;控制台程序需自己写构建逻辑。
实操建议:
- 确保
appsettings.json文件属性设为 “复制到输出目录:如果较新则复制” - 加载时要调用
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true),reloadOnChange开启后文件修改才实时生效 - 别直接 new
ConfigurationBuilder()就完事 —— 必须调用.Build()才能得到可读取的IConfiguration实例
读取配置值时 GetSection() 和 GetValue<t>()</t> 有什么区别?
GetValue<t>()</t> 只能读单个标量值(string/int/bool),且类型必须匹配或可隐式转换;GetSection() 返回子配置节点,适合读对象或集合。
容易踩的坑:
- 用
GetValue<int>("Db.Port")</int>读不到值?因为Db.Port是嵌套路径,GetValue不支持点号解析,得先GetSection("Db").GetValue<int>("Port")</int> - 从
appsettings.json读数组时,GetSection("Features").Get<list>>()</list>才有效,GetValue会返回 null - 类型转换失败不报错,而是静默返回默认值(比如 int 返回 0),建议配合
TryGetValue或日志验证
为什么本地读得通,发布后就拿不到配置?
根本原因:发布后的输出目录结构变了,appsettings.json 没被复制过去,或路径写死导致找不到文件。
性能与兼容性影响:.NET 6+ 默认启用配置重载(reloadOnChange: true),但 IIS 或某些容器环境会锁文件,导致重载失败,日志里可能只显示“无法监视文件变化”这种模糊提示。
实操建议:
- 检查发布后输出目录是否存在
appsettings.json,没有就回看文件属性设置 - 避免在
Program.cs顶层语句外提前读配置 —— 此时IConfiguration可能还没构建好 - 跨平台部署时,Linux 下路径区分大小写,
AppSettings.json和appsettings.json是两个文件


















