ASP.NET Core读取appsettings与Azure App Service配置最佳实践
ASP.NET Core 实现本地与Azure App Service配置自动覆盖的最佳实践
你要的效果是ASP.NET Core配置系统原生支持的能力,不需要额外开发自定义逻辑,默认行为就和传统ASP.NET Framework中Azure配置自动覆盖web.config的逻辑一致。
核心规则:配置优先级
ASP.NET Core的配置系统基于多个配置提供程序构建,后注册的提供程序中的同名配置,会自动覆盖先注册的提供程序的配置值。默认VS模板生成的项目中,配置提供程序的注册顺序天然满足需求:
- 先加载
appsettings.json - 再加载对应运行环境的
appsettings.{Environment}.json - 最后加载系统环境变量(Azure App Service门户中配置的应用设置,会以环境变量的形式注入到应用进程中,优先级最高)
也就是说本地调试时没有Azure注入的环境变量,自然读取本地appsettings.json的值;部署到Azure后,同名配置会自动被门户上配置的值覆盖,不需要写任何环境判断代码。
具体落地步骤
- 修正本地
appsettings.json的格式:你贴的配置片段最后多了一个多余的尾逗号,会导致json解析失败,正确格式如下:
"Sites": { "SiteToWorkWith": { "SiteUrl": "https://contoso.sharepoint.com/sites/pnp", "AADClientID": "xxx-xxx" } }
- Azure门户配置对应键值:配置层级之间用
:分隔作为键名即可,和你代码里读取配置的路径完全一致。对应你的配置结构,需要在Azure应用设置中添加两个条目:- 键:
Sites:SiteToWorkWith:SiteUrl,值为生产环境的SharePoint站点地址 - 键:
Sites:SiteToWorkWith:AADClientID,值为生产环境的AAD客户端ID
配置界面参考:
- 键:
- 代码读取配置和平时完全一致:不管是用
IConfiguration直接取值,还是用IOptions<>、IOptionsSnapshot<>做强类型绑定,框架会自动按优先级返回正确的值。
注意事项
- 如果你是手动搭建的项目、不是用官方默认模板生成的,一定要检查
Program.cs里配置提供程序的注册顺序:环境变量提供程序必须放在appsettings.json提供程序之后注册,否则会出现本地配置覆盖Azure配置的异常。默认模板生成的注册顺序是正确的,不需要修改。 - 生产环境的敏感配置(比如AAD客户端密钥这类)不要放在json文件里,直接在Azure门户配置即可,后续如果要接入Azure Key Vault存储密钥,只需要把Key Vault配置提供程序放在注册顺序的最后,就能实现密钥自动覆盖,不需要修改业务读取逻辑。
- 如果使用Azure部署槽位,槽位级别的应用设置也遵循同样的覆盖规则,不需要额外适配。
内容的提问来源于stack exchange,提问作者10120
相关产品推荐
相关产品推荐

