【问题标题】:Environment variables configuration in .NET Core.NET Core 中的环境变量配置
【发布时间】:2018-02-12 18:43:28
【问题描述】:

我在我的 API 中使用 .NET Core 1.1,但遇到了一个问题:

  1. 我需要有两个级别的配置:appsettings.json 和环境变量。
  2. 我想通过IOptionsDI 用于我的配置。
  3. 我需要环境变量来覆盖 appsettings.json 值。

所以到目前为止我都是这样做的:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
}

public IServiceProvider ConfigureServices(IServiceCollection services)
{
     // Something here
     services.Configure<ConnectionConfiguration>(options =>
            Configuration.GetSection("ConnectionStrings").Bind(options));
     // Something there
}

我的appsettings.json 是这样组成的

{
    "ConnectionStrings": {
        "ElasticSearchUrl": "http://localhost:4200",
        "ElasticSearchIndexName": "myindex",
        "PgSqlConnectionString": "blablabla"
    }
}

我将所有配置映射到我的班级ConnectionConfiguration.cs。但是我也无法映射环境变量。我尝试了以下名称:ConnectionStrings:ElasticSearchUrlElasticSearchUrl,甚至尝试将前缀指定为 .AddEnvironmentVariables("ConnectionStrings"),但没有任何结果。

我应该如何命名环境变量以便它可以映射到services.Configure&lt;TConfiguration&gt;()

【问题讨论】:

  • 当您尝试将变量命名为“ConnectionStrings:ElasticSearchUrl”时,发生了什么?配置中的结果键是什么?您能理解这个问题中已接受答案的第二部分:*.com/questions/37873964/… 吗?
  • @lenkan,我从 EV 中什么也没得到,模型中充满了空值。我确实检查了文档的相同部分,但它对我没有帮助。其实我连刚才在System.Environment.GetEnvironmentVariables()里面放的变量都看不到。
  • 啊,所以真正的问题是您无法读取环境变量。这与 ConfigurationBuilder 无关。我会先尝试解决这个问题。
  • 是的,我相信问题是因为我已经全部调试过了,一切都应该正常工作。路径还可以,即使.GetSection 也可以,但是变量非常错误(((

标签: c# .net environment-variables .net-core asp.net-core-1.1


【解决方案1】:

我相信您正在寻找这个:

var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        this.Configuration = builder.Build();

我有 3 个配置

  1. 开发-最终
  2. 本地开发
  3. 开发测试

还有 4 个 *.json 文件

  • appsettings.json
  • appsettnigs.dev-final.json
  • appsettings.dev-local.json
  • appsettings.dev-test.json

appsettings.json 保存全局配置值,以及其他文件特定的值。

【讨论】:

  • 一点也不,他正在尝试像使用 appsetting.json 一样对环境变量进行范围设置。
  • 对我来说听起来不对。为什么要创建一个特定于环境的配置文件,然后用另一个环境变量覆盖该配置文件中的内容?只需更改特定文件中的值即可。
  • 也许,但有时您只需要不属于特定环境的临时配置。因此,您可能不希望为此编辑配置文件的开销。那么一个不错的选择是使用环境变量或命令行参数来覆盖配置文件中的条目。所以我认为用例是有效的。
  • TBH 我在 AWS 中托管我的应用程序,我需要在不重新部署应用程序的情况下切换到不同的索引版本。
  • @lenkan 我相信它是。我从未尝试过,但您链接中的代码看起来像我发布的那个。
【解决方案2】:

看看ASP.NET Core Configuration with Environment Variables in IIS

要对环境变量执行相同操作,只需用冒号 (:) 分隔级别,例如 HitchhikersGuideToTheGalaxy:MeaningOfLife

在您的情况下,您将使用问题中提到的ConnectionStrings:ElasticSearchUrl

还要注意以下几点:

然而,当您部署到 IIS 时,事情变得有点棘手,不幸的是,缺少有关使用 IIS 进行配置的文档。您进入服务器的系统设置并配置所有环境变量。然后,您将应用部署到 IIS,然后它...爆炸了,因为它缺少那些必要的设置。

事实证明,为了在 IIS 中使用环境变量,您需要编辑应用程序池的高级设置。在那里,您会找到一个名为“加载用户配置文件”的设置。将其设置为 True。然后,回收 App Pool 加载到环境变量中。注意:即使您的环境变量被添加为“系统变量”而不是“用户变量”,您也必须这样做。

【讨论】:

    【解决方案3】:

    : 分隔符不适用于所有平台上的环境变量分层键。 __,双下划线,所有平台都支持,自动替换为:

    尝试将环境变量命名为ConnectionStrings__ElasticSearchUrl

    Source

    【讨论】: