我无法用环境变量覆盖appsettings.json
文件的设置。
appsettings.json
:
{
"AppSettings": {
"LocalUpdatesDir": "<some path>",
"BinaryDeltaCount": 5,
"BinaryDeltaFilenameTemplate": "<template>",
"Azure": {
"User": "user here",
"Password": "password here"
}
},
}
主:
public static void Main(string[] args)
{
var webHost = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
config.AddEnvironmentVariables();
})
.UseStartup<Startup>()
.Build();
webHost.Run();
}
环境变量:
更新1:
我可以看到,我的所有提供商都已注册:
真正奇怪的是:在环境变量列表中,大约有80个条目。我的两个新的遗失了,但是它有2个环境变量,我几个小时前创建并立即删除。他们来自哪里?!
更新2:
我重新启动了计算机,现在我在列表中看到了我的环境变量,但它没有覆盖appsettings.json
中的值?
答案 0 :(得分:5)
从env变量中删除ASPNETCORE_
前缀或将其作为参数添加到AddEnvironmentVariables
,默认情况下没有前缀。
编辑:尝试枚举配置以查看按键是否按预期排列。
private static void ShowConfig(IConfiguration config)
{
foreach (var pair in config.GetChildren())
{
Console.WriteLine($"{pair.Path} - {pair.Value}");
ShowConfig(pair);
}
}
答案 1 :(得分:2)
我和你在同一条船上,我想出了一些可以帮助你和其他所有人同样头痛的东西。
首先,如另一个答案所述,您不需要任何前缀。因此,除非您将ASPNETCORE_和AppSettings作为前缀传递到AddEnvironmentVariables()中,否则都不需要。因此,只需使用azure:password。
第二,您不一定需要使用双下划线来制作一个映射嵌套的appsettings值的env var。只需一个冒号即可。
示例:
此应用设置中的一个:
"azure": {
"password": "my.weak.azure.password"
}
可以被以下环境变量覆盖:
最后,添加到Windows上的环境变量的值显然是由Visual Studio或其后台进程(如控制台窗口主机)缓存的。关闭并重新打开Visual Studio将为您带来新的价值。这就是为什么您在重新启动计算机后注意到看到它们的原因。
答案 2 :(得分:0)
正如 Tratcher 所提到的,不需要前缀 ASPNETCORE_
。以下是一般如何使用环境变量覆盖应用设置的说明。
环境变量中有一种命名约定,用于将应用设置嵌套到环境变量 see naming of environment variables。
层次结构中的每个元素都由双下划线(偶数数组索引)分隔。 __
适用于所有平台,其他分隔符则不能。