ASP.NET Core部署Azure时配置加载异常问题咨询
1. 为什么Staging环境会使用Production的连接字符串?
核心原因是Azure App Service的应用设置(App Settings)优先级高于JSON配置文件,而非加载了appsettings.production.json文件。
你提到发布时设置了“运行时使用Azure数据库连接字符串作为DefaultConnection”,这个操作会触发Azure在App Service的应用配置中添加DefaultConnection对应的环境变量(Azure会把所有应用设置转为环境变量,格式为ConnectionStrings__DefaultConnection,对应配置系统里的ConnectionStrings:DefaultConnection)。
在ASP.NET Core的配置优先级规则里,环境变量 > JSON配置文件——哪怕你的代码只加载了appsettings.json和appsettings.Staging.json,只要Azure的应用设置里存在DefaultConnection,它就会直接覆盖JSON文件中的对应配置,完全不受当前环境是Staging还是Production的影响。
至于Azure自动生成的appsettings.production.json,其实它并没有被你的代码加载(因为当前环境是Staging,代码逻辑只加载appsettings.{env.EnvironmentName}.json也就是Staging版本),真正起作用的是Azure注入的环境变量。
2. 为什么看起来同时加载了Staging和Production的配置?
你看到的“用Staging的种子数据,却用Production的连接字符串”,并不是因为系统同时加载了两个环境的JSON文件,而是:
- 种子数据来自
appsettings.Staging.json(你的代码正常加载了这个文件) - 连接字符串被Azure的应用设置(环境变量)覆盖了,而这个连接字符串是你发布时指定的Azure SQL连接(被关联到Production的配置文件,但本质是环境变量的优先级更高)
3. 验证与解决方法
如果想确认这点,可以:
- 登录Azure Portal,进入你的App Service,打开「配置」→「应用设置」,查看是否存在
ConnectionStrings__DefaultConnection这个条目 - 如果不需要全局覆盖的连接字符串,可以删除该应用设置,系统就会使用
appsettings.Staging.json里的配置(若存在),或回退到appsettings.json的默认值 - 如果你想在Staging环境使用特定的Azure SQL连接,可以在Staging环境的应用设置里单独配置
ConnectionStrings__DefaultConnection,避免和Production配置混淆
最后补充下ASP.NET Core的配置优先级(从低到高),方便你理解规则:
- 文件配置(如
appsettings.json、appsettings.{env}.json) - 环境变量
- 命令行参数
- Azure Key Vault(若配置)
- Azure App Configuration(若配置)
内容的提问来源于stack exchange,提问作者Valuator

