.NET Core中的环境变量配置

时间:2017-09-04 13:53:51

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

我在我的API中使用.NET Core 1.1并遇到问题:

  1. 我需要有两个级别的配置:appsettings.json和环境变量。
  2. 我想通过IOptions使用DI作为我的配置。
  3. 我需要环境变量来覆盖appsettings.json值。
  4. 所以我到目前为止这样做:

    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<TConfiguration>()

    进行映射

3 个答案:

答案 0 :(得分:2)

:分隔符不适用于所有平台上的环境变量层次结构键。所有平台均支持__(双下划线),并且会自动将其替换为:

尝试像这样ConnectionStrings__ElasticSearchUrl

来命名环境变量

Source

答案 1 :(得分:0)

我相信你正在寻找这个:

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. DEV-最终
  2. DEV-本地
  3. DEV-测试
  4. 和4 * .json文件

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

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

答案 2 :(得分:0)

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

  

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

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

另请注意以下事项:

  

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

     

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