跳转到主内容
极星编程网:以代码为星,赴技术山海!

C#怎么读取Appsettings.json_C#在Core中如何获取配置【技巧】

根本原因是 IConfiguration 未通过 DI 容器注入:普通类需注册到 DI 并通过构造函数接收 IConfiguration;GetSection 返回 null 多因键名大小写或冒号分隔错误;Get() 静默失败源于 JSON key 与 C# 属性名不匹配;环境配置文件需手动设 CopyToOutputDirectory 且依赖 ASPNETCORE_ENVIRONMENT 环境变量。

为什么
IConfiguration
在 Startup.cs 里能用,一到普通类里就为 null? 根本原因不是配置没加载,而是你没把类注册进 DI 容器,或者没通过构造函数注入
IConfiguration
。Core 的配置对象是服务,不是全局静态变量——直接
new
一个类,又不传配置进去,它当然不知道
appsettings.json
在哪。 实操建议: 普通业务类必须通过构造函数接收
IConfiguration
(别自己 new,别 static 调用) 确保该类本身也注册进了 DI,比如在
Program.cs
中调用
services.AddScoped()
如果只是临时读取、不在服务生命周期内,可用
WebHostEnvironment
+
JsonConfigurationProvider
手动加载,但非常规做法,容易漏掉环境叠加(如
appsettings.Development.json
)
GetSection("Logging")
返回 null?检查路径拼写和层级嵌套 JSON 的层级结构会变成冒号分隔的扁平键,比如
{"ConnectionStrings": {"Default": "..."}}
对应的键是
ConnectionStrings:Default
,而不是
ConnectionStrings.Default
或
ConnectionStrings/Default
。用错分隔符或大小写不匹配,
GetSection
就静默返回空节(不是抛异常)。 常见错误现象:
config.GetSection("connectionstrings")
→ 全小写,但 JSON 里是
ConnectionStrings
(首字母大写),结果为空
config.GetSection("AppSettings:Title")
→ 但 JSON 里实际是
{"AppSettings": {"title": "..."}}
,key 是小写
title
,大小写敏感 多层嵌套时漏掉中间段,比如想取
Cache:Redis:Host
,却写了
Cache:Host
验证方法:在启动时加一行日志
Console.WriteLine(string.Join(", ", config.AsEnumerable().Select(kv => kv.Key)));
,看实际加载进来的 key 列表。 用
Get()
映射对象时,属性名对不上就静默失败
Get()
依赖 JSON property name 和 C# 属性名的默认映射(驼峰转 PascalCase,或靠
[JsonPropertyName]
)。一旦命名不一致,属性值就是默认值(
0
、
null
、
false
),不会报错也不会警告。 C知道 CSDN推出的一款AI技术问答工具 下载 使用场景:适合结构稳定、可定义 POCO 类的配置项(如数据库连接、第三方 API 密钥);不适合动态 key 或运行时才确定结构的配置。 实操建议: C# 属性名严格对应 JSON key(大小写、下划线、驼峰都要一致),或显式加
[JsonPropertyName("my_key")]
不要依赖“自动转换”,比如 JSON 是
"redis_host"
,C# 写
public string RedisHost { get; set; }
—— 默认不生效,得配
ConfigureOptions
或用
JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase
调试时先用
GetSection("xxx").GetChildren()
看原始子节点,确认数据确实存在且可枚举 开发环境读的是
appsettings.Development.json
,但发布后没生效? 因为发布时默认只包含
appsettings.json
,其他环境文件不会自动复制到输出目录。如果你把开发专用配置(如本地 Redis 地址、测试密钥)全写在
Development
文件里,上线后
IConfiguration
就读不到它们了。 性能 / 兼容性影响: 环境文件是“叠加”而非“替换”:基础配置写
appsettings.json
,差异化部分写
appsettings.{Environment}.json
确保发布时
appsettings.*.json
的
CopyToOutputDirectory
设为
PreserveNewest
(csproj 里加
) 环境变量
ASPNETCORE_ENVIRONMENT
必须与文件名后缀完全一致(区分大小写),Windows 命令行设
set ASPNETCORE_ENVIRONMENT=Production
,Linux 用
export ASPNETCORE_ENVIRONMENT=Production
最常被忽略的是:以为改了代码里的
Environment.EnvironmentName
就等于切换了配置源,其实它只影响
IHostingEnvironment
,真正决定加载哪些 JSON 文件的是启动时的环境变量或命令行参数。

相关文章