我在我的API中使用.NET Core 1.1,并且正在努力解决问题:
- 我需要有两个级别的配置:
appsettings.json
和环境变量。 - 我想通过
IOptions
使用DI进行配置。 - 我需要环境变量来覆盖
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:ElasticSearchUrl
,ElasticSearchUrl
,甚至尝试在没有任何结果的情况下指定.AddEnvironmentVariables("ConnectionStrings")
的前缀。
我应该如何将环境变量命名,以便可以用services.Configure<TConfiguration>()
映射?
自动替换
:
分离器与所有平台上的环境变量层次键无法使用。__
,双重下划线,由所有平台支持,并由:
尝试将环境变量命名,例如ConnectionStrings__ElasticSearchUrl
源
在IIS
中的环境变量中查看ASP.NET核心配置要使用环境变量进行相同的操作,您只需将级别与结肠分开(:),例如
HitchhikersGuideToTheGalaxy:MeaningOfLife
。
在您的情况下,您将使用问题中提到的ConnectionStrings:ElasticSearchUrl
。
还注意以下内容:
当您部署到IIS时,事情会变得更加棘手,不幸的是,缺少有关与IIS使用配置的文档。您进入服务器的系统设置并配置所有环境变量。然后,您将应用程序部署到IIS,然后...爆炸,因为它缺少这些必要的设置。
事实证明,为了将环境变量与IIS一起使用,您需要编辑应用程序池的高级设置。在那里,您会找到一个设置,称为"加载用户配置文件" 。将其设置为 true 。然后,回收应用程序池以加载在环境变量中。注意:即使您的环境变量添加为"系统变量",您也必须执行此操作。
我相信您正在寻找:
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个配置
- Dev-Final
- Dev-Local
- dev-test
和4 *.json文件
- appsettings.json
- appsettnigs.dev-final.json
- appsettings.dev-local.json
- appsettings.dev-test.json
appsettings.json保留全局配置值,而其他文件则具有特定文件。