实际上,这个问题是在我深入研究.NET 6中的配置设置时出现的。我已经设置了要在Production windows服务器中使用的系统环境变量。根据MS文档,如果我们想读取系统环境变量,需要使用.AddEnvironmentVariables()
扩展方法。因此,我对Program.cs(Main())进行了如下修改。
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{env}.json",optional:true)
.AddEnvironmentVariables()
.Build();
然后我读取环境变量,比如
var conString = configuration["DBConnection:ConnectionString"];
一切都很好。一切都如预期的那样。
我的问题是,即使我删除了.AddEnvironmentVariables()
扩展方法,它也能工作。这是因为,.NET给环境变量更高的优先级(如果我错了请纠正我)。另外,请参考link。
然后我看了看.AddEnvironmentVariables()
还能做些什么,实际上它可以用来设置带前缀的环境变量,比如.AddEnvironmentVariables(prefix:"P2:")
,我已经把我的带前缀的env变量设置为P2__Name
,还有另一个env变量,设置为Name
,我把这个值读为var name = configuration["Name"];
当我运行API时,它总是读取"Name"
环境变量的值。而不是"P2__Name"
值。我做错了什么。它不应该返回带前缀的环境变量值吗?
**p.s.**我有多个.net应用程序要托管在一个Windows服务器上。所有这些应用程序在appsettings.json
中都有dbConnection字符串。我想从appsettings.json
中删除这些应用程序,并将它们保留为环境变量
1条答案
按热度按时间hmae6n7t1#
对于
P2__Name
和Name
环境变量:使用
MyCustomPrefix_
前缀设置的环境变量会覆盖默认的配置提供程序。* 这包括没有前缀 * 的环境变量。前缀将不是配置密钥的一部分!因此两者都将具有
Name
配置密钥,并且根据文档,P2__Name
环境变量的值应覆盖Name
配置密钥的值。建议前缀以单个下划线字符(
_
)结尾。冒号字符(
:
)和双下划线字符串(__
)是层次结构分隔符(它们与前缀无关),请参见配置键和值部分。在环境变量中,冒号分隔符可能无法在所有平台上使用。所有平台都支持双下划线
__
,并自动转换为冒号:
。若要使用带前缀的连接字符串,请参阅文档,确定其中一个特殊前缀是否适合您的需要。
也可以使用自定义前缀。
总结如下:
...
可以是CUSTOM
、SQL
、MYSQL
和SQLAZURE
要获取连接字符串,只需要
YourKey
: