【问题标题】:How can appSettings.{environment}.json be loaded before environment is known? (AspNetCore)在已知环境之前如何加载 appSettings.{environment}.json? (AspNetCore)
【发布时间】:2019-05-24 08:32:22
【问题描述】:
根据microsoft blog ASPNETCORE_ENVIRONMENT 变量按顺序加载:
- appsettings.json 文件
- appsettings.{env.EnvironmentName}.json 文件
- 本地用户机密文件
- 环境变量
- 命令行参数(或等效的launchSettings.json)
和“最后加载的密钥获胜”。
问题:
但是如何在知道最终环境之前加载文件 appsettings.{env.EnvironmentName}.json?
我是否会通过命令行设置“暂存”环境并加载 appSettings.Development.json,因为在第 2 步中它还不知道?
【问题讨论】:
标签:
asp.net-core
environment-variables
【解决方案1】:
一个 ASP.NET Core 应用程序有两组配置:
- WebHost 的配置。
- 应用程序本身的配置。
首先构建 WebHost 配置 (source):
_config = new ConfigurationBuilder()
.AddEnvironmentVariables(prefix: "ASPNETCORE_")
.Build();
如源代码所示,WebHost 的配置仅 使用环境变量,并且仅使用以ASPNETCORE_ 为前缀的环境变量。不出所料,其中一个环境变量是ASPNETCORE_ENVIRONMENT。
稍后,IHostingEnvironment 的实现被实例化。这最终使用_config 检索名为environment 的配置设置,该设置来自ASPNETCORE_ENVIRONMENT 变量。如果没有这个值,则默认为Production。
接下来,构建应用程序本身的配置。在您问题的第 2 步,env.EnvironmentName 的值来自我已经提到的IHostingEnvironment。如果您要设置环境值,例如Staging 作为命令行参数,它不会更改 WebHost 配置中使用的值,因为这仅适用于应用程序配置。
Andew Lock goes into more detail 关于这一切的工作原理,还演示了如何配置 WebHost 以使用其他配置源。