我正在使用 ASP.NET Core 5.0,并且有一个 Web API 应用程序部署到内部云,其中很少有设置(例如 DB)是通过主机云上的环境变量进行控制的。在我的 Startup.cs 中,我有以下代码
string projectDbConnection = Configuration.GetSection("ProjectDatabaseSettings").GetValue<string>("PROJECT_DB_CONNECTION");
string projectDbName = Configuration.GetSection("ProjectDatabaseSettings").GetValue<string>("PROJECT_DB_NAME");
据我了解,当在 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");
我无法理解之间的区别GetSection.GetValue
并且只是GetValue
以及为什么我应该使用Configuration.GetValue()
指示应用程序从环境变量中读取。
我缺少什么以及我们什么时候应该使用什么?
环境变量的命名
有一种环境变量的命名约定对于环境变量的嵌套应用程序设置,查看环境变量的命名 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0#naming-of-environment-variables。
层次结构中的每个元素都由双下划线分隔。
在您的情况下,如果您命名 env 变量,它将起作用:ProjectDatabaseSettings__PROJECT_DB_CONNECTION
.
配置顺序
关于微软文档 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0检查配置源有一个顺序。
- ChainedConfigurationProvider :添加现有 IConfiguration 作为源。在默认配置情况下,添加主机配置并将其设置为应用程序配置的第一个源。
- appsettings.json 使用 JSON 配置提供程序。
-
appsettings.Environment.json使用 JSON 配置提供程序。例如,appsettings.Production.json 和 appsettings.Development.json。
- 应用程序在开发环境中运行时的应用程序机密。
-
环境变量使用环境变量配置提供程序。
- 使用命令行配置提供程序的命令行参数。
用例
当您使用 appsettings.json 进行本地开发,但在生产中的集群或云中运行时,这非常有用,在这些环境中使用环境变量会更方便(例如:在 kubernetes 中,环境变量是通过配置映射设置的)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)