环境变量名称如何反映 appsettings.json 的结构

Pro*_*zzz 2 asp.net-core-5.0

我正在使用 ASP.NET Core 5.0,并且我有一个部署到内部云的 Web API 应用程序,其中几乎没有像数据库这样的设置是通过主机云上的环境变量来控制的。在我的 Startup.cs 中,我有以下代码

string projectDbConnection = Configuration.GetSection("ProjectDatabaseSettings").GetValue<string>("PROJECT_DB_CONNECTION");
string projectDbName = Configuration.GetSection("ProjectDatabaseSettings").GetValue<string>("PROJECT_DB_NAME");
Run Code Online (Sandbox Code Playgroud)

据我了解,当在 IIS Express 本地运行时,它会查找应用程序设置。<Environment>.json 并且它们优先于 appsettings.json 值。

但是当我部署到云时,这个应用程序总是连接到错误的数据库,其中我提到了PROJECT_DB_CONNECTION&PROJECT_DB_NAME作为应用程序的环境变量。为了使应用程序从环境变量中读取,我必须将 Startup.cs 中的上述代码更改为

string projectDbConnection = Configuration.GetValue<string>("PROJECT_DB_CONNECTION");
string projectDbName = Configuration.GetValue<string>("PROJECT_DB_NAME");
Run Code Online (Sandbox Code Playgroud)

我无法理解GetSection.GetValue和 just之间的区别GetValue 以及为什么我应该使用Configuration.GetValue()直接应用程序从环境变量中读取。

我缺少什么以及我们什么时候应该使用什么?

kra*_*ego 5

环境变量的命名

环境变量中有一种用于将应用程序设置嵌套到环境变量的命名约定,请参阅环境变量的命名。层次结构中的每个元素都由双下划线分隔。

在您的情况下,如果您将 env 变量命名为: ,它就会起作用ProjectDatabaseSettings__PROJECT_DB_CONNECTION。

配置顺序

关于Microsoft 文档,有一个检查配置源的顺序。

  • ChainedConfigurationProvider :添加现有 IConfiguration 作为源。在默认配置情况下,添加主机配置并将其设置为应用程序配置的第一个源。
  • appsettings.json 使用 JSON 配置提供程序。
  • 使用 JSON 配置提供程序的appsettings.Environment.json 。例如,appsettings.Production.json 和 appsettings.Development.json。
  • 应用程序在开发环境中运行时的应用程序机密。
  • 使用环境变量配置提供程序的环境变量。
  • 使用命令行配置提供程序的命令行参数。

用例

当您使用 appsettings.json 进行本地开发,但在生产中的集群或云中运行时,使用环境变量更方便(fe:在 kubernetes 中,环境变量是通过配置映射设置的),这非常有用。