无法使用环境变量覆盖appsettings.json设置

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

Rez*_*Net 9

我和你在同一条船上,我想出了一些可以帮助你和其他有同样头痛问题的人的方法。

首先,正如另一个答案中提到的,您不需要任何前缀。因此 ASPNETCORE_ 和 AppSettings 都是不必要的,除非您将它们作为前缀传递到 AddEnvironmentVariables() 中。所以只需使用 azure:password 即可。

其次,您不一定需要双下划线来创建映射嵌套 appsettings 值的环境变量。只需使用一个冒号即可。

例子:

应用程序设置中的这一项:

"azure": {
  "password": "my.weak.azure.password"
}
Run Code Online (Sandbox Code Playgroud)

可以被这个环境变量覆盖:

在此输入图像描述

最后,添加到 Windows 环境变量中的值显然是由 Visual Studio 或其后台进程(如控制台窗口主机)缓存的。关闭并重新打开 Visual Studio 将为您提供新值。这就是为什么您在重新启动计算机后注意到看到它们的原因。

在此输入图像描述

  • 并非所有平台都支持 ```:```,例如在 ```bash``` 中(fe:docker 环境) (7认同)

Tra*_*her 6

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)

  • @Tratcher感谢您的提示。我要做两件事:1)更改环境变量后重新启动计算机。2)将环境变量更改为此语法“ AppSettings:Azure:User” (2认同)

abb*_*33f 6

调用函数的顺序.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 中的值。