ASP.NET Core多环境配置依赖ASPNETCORE_ENVIRONMENT环境变量与命名规范的JSON文件组合生效,需确保变量值与appsettings.{EnvironmentName}.json文件名完全一致(含大小写),加载顺序为基础文件→环境文件→环境变量→命令行参数。

ASP.NET Core 多环境配置不是靠猜,而是靠 ASPNETCORE_ENVIRONMENT 环境变量 + 命名规范的 JSON 文件组合生效。没设对变量、文件名拼错、加载顺序搞反,都会导致配置不生效——你改了 appsettings.Production.json,但程序实际还在读 appsettings.json。
怎么确认当前环境变量是否生效
最直接的办法是启动时打日志或断点看 IWebHostEnvironment.EnvironmentName 的值。别信 launchSettings.json 里写了就一定起作用——它只影响 Visual Studio 或 dotnet run 启动方式,而 dotnet publish 后用 dotnet MyApp.dll 运行时,它完全不生效。
- Windows 命令行临时设置:
set ASPNETCORE_ENVIRONMENT=Production(仅当前窗口) - Linux/macOS 临时设置:
export ASPNETCORE_ENVIRONMENT=Staging - Dockerfile 中必须显式声明:
ENV ASPNETCORE_ENVIRONMENT=Production - 在 IIS 或 Linux systemd 服务中,要单独配置环境变量,不能依赖开发机设置
常见错误:Windows 下大小写不敏感,Linux 下严格区分大小写,production 和 Production 是两个环境。
appsettings.*.json 文件命名和加载顺序
框架只认固定格式:appsettings.{EnvironmentName}.json,且 {EnvironmentName} 必须与 ASPNETCORE_ENVIRONMENT 的值**完全一致**(包括大小写)。文件本身不存在不会报错,只是跳过加载。
- 基础配置必须叫
appsettings.json,否则整个配置系统可能崩 -
appsettings.Development.json只在ASPNETCORE_ENVIRONMENT=Development时加载 - 加载顺序是:基础文件 → 环境文件 → 环境变量 → 命令行参数,后加载的覆盖同名键
- 不要试图用
appsettings.Test.json,除非你把环境变量也设成Test;框架不校验值是否为 Development/Staging/Production,但约定俗成只用这三个
注意:optional: true 是默认行为,不用显式写;但如果你在 Program.cs 手动调用 AddJsonFile,漏掉 optional: true 会导致环境文件缺失时报 FileNotFoundException。
IConfiguration 怎么拿到正确的值
别在 Startup 构造函数里直接用 Configuration["Key"]——此时配置还没加载完。正确时机是 ConfigureServices 方法内,或通过 DI 注入到服务中使用。
- 推荐方式:构造函数注入
IConfiguration,然后用configuration.GetSection("Database").Get<databaseoptions>()</databaseoptions>强类型读取 - 避免硬编码路径,比如
configuration["ConnectionStrings:Default"]比configuration["Database:ConnectionString"]更符合默认模板习惯 - 敏感信息(如 API 密钥)不要写进 JSON 文件,改用环境变量:
MyApp__ApiSettings__ApiKey=xxx(双下划线代替冒号),IConfiguration会自动映射 - 环境变量优先级高于 JSON 文件,所以生产环境部署时,可以直接用环境变量覆盖数据库连接字符串,无需改包
为什么本地调试正常,一上服务器就出错
绝大多数情况是环境变量没传进去,或者传错了层级。Linux 服务器上尤其容易踩坑:
- systemd 服务文件里必须加
Environment="ASPNETCORE_ENVIRONMENT=Production",不能只写在 shell 脚本里 - Nginx 反向代理不传递环境变量,它只管 HTTP 流量;环境变量是进程级的,跟 Nginx 无关
- Docker 容器启动后,
docker exec -it xxx bash进去看到的ASPNETCORE_ENVIRONMENT是容器启动时的值,不是宿主机的 - CI/CD 流水线(如 GitHub Actions)里,要用
env:显式注入,而不是靠 workflow 全局变量
最保险的验证方式:在 Program.cs 开头加一行 Console.WriteLine($"Env: {builder.Environment.EnvironmentName}");,发布后看控制台第一行输出是什么。


















