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

时间:2018-01-09 12:36:21

标签: c# asp.net-core .net-core

我无法用环境变量覆盖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();
}

环境变量:

enter image description here

  

更新1:

我可以看到,我的所有提供商都已注册:

enter image description here

真正奇怪的是:在环境变量列表中,大约有80个条目。我的两个新的遗失了,但是它有2个环境变量,我几个小时前创建并立即删除。他们来自哪里?!

  

更新2:

我重新启动了计算机,现在我在列表中看到了我的环境变量,但它没有覆盖appsettings.json中的值?

3 个答案:

答案 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"
}

可以被以下环境变量覆盖:

enter image description here

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

enter image description here

答案 2 :(得分:0)

正如 Tratcher 所提到的,不需要前缀 ASPNETCORE_。以下是一般如何使用环境变量覆盖应用设置的说明。

为 appsettings 命名环境变量

环境变量中有一种命名约定,用于将应用设置嵌套到环境变量 see naming of environment variables。 层次结构中的每个元素都由双下划线(偶数数组索引)分隔。 __ 适用于所有平台,其他分隔符则不能。