rol*_*i09 2 c# .net-core asp.net-core
我无法appsettings.json使用环境变量覆盖文件的设置。
appsettings.json:
{
"AppSettings": {
"LocalUpdatesDir": "<some path>",
"BinaryDeltaCount": 5,
"BinaryDeltaFilenameTemplate": "<template>",
"Azure": {
"User": "user here",
"Password": "password here"
}
},
}
Run Code Online (Sandbox Code Playgroud)
主要:
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();
}
Run Code Online (Sandbox Code Playgroud)
环境变量:
更新1:
在这里,我可以看到我所有的提供者都已注册:
什么是真的很奇怪:在环境变量列表,也有它约80项。我的两个新变量不见了,但是其中有2个环境变量,这些变量是我几个小时前创建并立即删除的。它们来自何处?
更新2:
我重新启动我的电脑,现在我看到我的环境变量在列表中,但它并不能取代在价值appsettings.json?
我和你在同一条船上,我想出了一些可以帮助你和其他有同样头痛问题的人的方法。
首先,正如另一个答案中提到的,您不需要任何前缀。因此 ASPNETCORE_ 和 AppSettings 都是不必要的,除非您将它们作为前缀传递到 AddEnvironmentVariables() 中。所以只需使用 azure:password 即可。
其次,您不一定需要双下划线来创建映射嵌套 appsettings 值的环境变量。只需使用一个冒号即可。
例子:
应用程序设置中的这一项:
"azure": {
"password": "my.weak.azure.password"
}
Run Code Online (Sandbox Code Playgroud)
可以被这个环境变量覆盖:
最后,添加到 Windows 环境变量中的值显然是由 Visual Studio 或其后台进程(如控制台窗口主机)缓存的。关闭并重新打开 Visual Studio 将为您提供新值。这就是为什么您在重新启动计算机后注意到看到它们的原因。
ASPNETCORE_从您的env变量中删除前缀或将其作为参数添加到AddEnvironmentVariables,默认情况下没有前缀。
编辑:尝试枚举配置,以查看键是否按预期排列。
private static void ShowConfig(IConfiguration config)
{
foreach (var pair in config.GetChildren())
{
Console.WriteLine($"{pair.Path} - {pair.Value}");
ShowConfig(pair);
}
}
Run Code Online (Sandbox Code Playgroud)
调用函数的顺序.Add()很重要。如果您想覆盖 appsettings.json 中的值,那么这
builder.Configuration
.AddEnvironmentVariables()
.AddUserSecrets(Assembly.GetExecutingAssembly())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", true, true);
Run Code Online (Sandbox Code Playgroud)
不会覆盖 Json 中的值,它会执行相反的操作。
builder.Configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env}.json", true, true)
.AddEnvironmentVariables()
.AddUserSecrets(Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)
这将使用环境变量覆盖 Json 中的值。
| 归档时间: |
|
| 查看次数: |
4572 次 |
| 最近记录: |