在 ASP.NET Core 中,appsettings.json
和 appsettings.Development.json
是配置文件的分层机制 ,用于支持不同环境(Environment)下的差异化配置 。它们的核心区别在于:后者会覆盖前者中相同名称的配置项,且仅在 Development(开发)环境下生效。
✅ 一、基本概念
1. appsettings.json
- 主配置文件
- 包含所有环境通用的默认配置
- 例如:日志级别、功能开关、通用连接字符串等
json
{
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*",
"FeatureToggle": {
"NewCheckout": false
}
}
2. appsettings.Development.json
- 环境特定配置文件
- 仅当应用运行在
Development
环境时加载 - 覆盖
appsettings.json
中同名的配置项 - 通常用于:
- 开启详细日志
- 使用开发数据库
- 启用调试功能
json
{
"Logging": {
"LogLevel": {
"Default": "Debug", // 覆盖主配置
"Microsoft": "Warning"
}
},
"ConnectionStrings": {
"Default": "Server=dev-db;Database=MyApp_Dev;..." // 开发专用连接字符串
},
"FeatureToggle": {
"NewCheckout": true // 开发环境开启新功能
}
}
🔁 二、配置加载顺序与覆盖规则
ASP.NET Core 默认通过 CreateDefaultBuilder()
按以下顺序加载配置(后加载的覆盖先加载的):
appsettings.json
appsettings.{Environment}.json
← 例如appsettings.Development.json
- 用户机密(仅开发环境)
- 环境变量
- 命令行参数
📌 关键点 :
如果
appsettings.Development.json
和appsettings.json
都有"Logging:LogLevel:Default"
,
开发环境下以Development.json
的值为准。
🌍 三、环境(Environment)如何确定?
应用的环境由 ASPNETCORE_ENVIRONMENT
环境变量决定:
环境变量值 | 加载的配置文件 |
---|---|
Development |
appsettings.json + appsettings.Development.json |
Staging |
appsettings.json + appsettings.Staging.json |
Production |
appsettings.json + appsettings.Production.json |
未设置 | 默认为 Production |
设置方式示例:
✅ 开发时(Visual Studio / VS Code)
-
默认自动设置为
Development
-
可在
launchSettings.json
中查看/修改:json{ "profiles": { "MyApp": { "commandName": "Project", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
✅ 服务器部署(Linux)
bash
export ASPNETCORE_ENVIRONMENT=Production
dotnet MyApp.dll
🛠️ 四、典型使用场景
配置项 | appsettings.json (通用) |
appsettings.Development.json (开发专用) |
---|---|---|
日志级别 | "Information" |
"Debug" 或 "Trace" |
数据库连接 | 生产数据库 | 本地 SQL Server / SQLite |
外部服务地址 | https://api.prod.example.com |
https://localhost:5001 (Mock 服务) |
错误页面 | 用户友好错误页 | 开发者异常详细页(含堆栈) |
缓存时间 | 3600 秒 | 0(禁用缓存,便于调试) |
💡 提示:永远不要在
appsettings.Development.json
中存放生产敏感信息(如生产密钥),因为它通常会被提交到代码仓库。
🔐 五、安全建议
-
敏感配置(如密码、密钥)不要硬编码在 JSON 文件中
-
开发环境:使用 用户机密(Secret Manager)
bashdotnet user-secrets set "ConnectionStrings:Default" "..."
-
生产环境:使用 环境变量 或 Azure Key Vault / AWS Secrets Manager
-
-
appsettings.Production.json
通常不提交到 Git (通过.gitignore
忽略),而由部署流程注入。
✅ 六、总结
对比项 | appsettings.json |
appsettings.Development.json |
---|---|---|
作用 | 通用默认配置 | 开发环境覆盖配置 |
加载条件 | 总是加载 | 仅当 ASPNETCORE_ENVIRONMENT=Development |
优先级 | 低 | 高(会覆盖同名项) |
是否提交到 Git | 是 | 通常是(但不含敏感信息) |
典型内容 | 生产安全的默认值 | 调试友好、详细日志、本地依赖 |
🌟 核心思想 :
"通用配置放主文件,环境差异放环境文件" ------ 这是 ASP.NET Core 实现"一次构建,多环境部署"的关键实践。