在使用ICONFIGURATIONBUILDER在.NET CORE 2.1应用程序中使用通用主机I配置4个来源;但是,在配置范围之后,有6个来源。
在某个点2,我已经加载了我已经加载的其他来源,第二次以引起appsettings.environment.json值隐藏的顺序添加。我还尝试过删除hostsettings.json配置并验证那不影响这一点。这是用于使用WebJobssdk 3.0和.Net Core 2.1
的Azure WebJob var builder = new HostBuilder()
.ConfigureHostConfiguration(configurationBuilder =>
{
//This is to do some basic host configuration and should only add 2 sources
configurationBuilder.SetBasePath(Directory.GetCurrentDirectory());
configurationBuilder.AddJsonFile("hostsettings.json", optional: true);
configurationBuilder.AddEnvironmentVariables(prefix: "APPSETTING_ASPNETCORE_");
})
.ConfigureAppConfiguration((hostContext, configurationBuilder) =>
{
//at this point there are 0 sources in the sources
IHostingEnvironment env = hostContext.HostingEnvironment;
configurationBuilder.SetBasePath(Directory.GetCurrentDirectory());
configurationBuilder.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appSettings.{env.EnvironmentName}.json", optional: true,
reloadOnChange: true);
configurationBuilder.AddEnvironmentVariables(prefix: "APPSETTING_ASPNETCORE_");
//at this point there are 4 sources
})
.ConfigureServices((hostContext, servicesCollection) =>
{
//now there are 6, 2 additional source that are duplicates
servicesCollection.Configure<IConfiguration>(hostContext.Configuration);
})
我希望只有4个来源的配置提供商,包括ChainedConfigsource,我已经设置了设置。但是,添加了2个其他资源,这些源是AppSettings.json和环境变量的重复。
现在,当注入一个类中时,appsettings.json设置上次通过appsettings.environment.json
可以重新订购builder.Sources
以满足您的需求。例如,这是一种扩展方法,您可以在最后一个方法之后使用它来添加新的JSON文件,而不是在最后:
public static class ConfigurationBuilderExtensions
{
public static IConfigurationBuilder AddJsonFileAfterLastJsonFile(this IConfigurationBuilder builder, string path, bool optional, bool reloadOnChange)
{
var jsonFileSource = new JsonConfigurationSource
{
FileProvider = null,
Path = path,
Optional = optional,
ReloadOnChange = reloadOnChange
};
jsonFileSource.ResolveFileProvider();
var lastJsonFileSource = builder.Sources.LastOrDefault(s => s is JsonConfigurationSource);
var indexOfLastJsonFileSource = builder.Sources.IndexOf(lastJsonFileSource);
builder.Sources.Insert(indexOfLastJsonFileSource == -1
? builder.Sources.Count
: indexOfLastJsonFileSource + 1, jsonFileSource);
return builder;
}
}
您可以这样使用它:
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.AddJsonFileAfterLastJsonFile(
"appsettings.Custom.json",
optional: true,
reloadOnChange: false);
})
您可以适应您的需求并在需要的任何地方插入它。
,但添加了2个其他来源,这是
appsettings.json
的重复和环境变量的重复
我使用HostBuilder
也有类似的问题,并注意到这两个源被附加到配置源列表的末尾。这有不良的结果:appsettings.json
的开发设置覆盖了appsettings.Production.json
的生产设置。
这些其他来源似乎由ConfigureWebJobs
添加。
修复程序是重新排序HostBuilder
呼叫链,以便在呼叫ConfigureAppConfiguration
之前呼叫ConfigureWebJobs
。这些额外的两个来源仍然存在,但是由于它们现在处于配置源列表的开始,而不是最后,它们没有不良的效果。
读取hostbuilder.cs类的源代码。
构建调用将首先创建hostingConfiguration,然后创建AppConfiguration。
这是构建hostingConfiguration
的代码 private void BuildHostConfiguration()
{
var configBuilder = new ConfigurationBuilder();
foreach (var buildAction in _configureHostConfigActions)
{
buildAction(configBuilder);
}
_hostConfiguration = configBuilder.Build();
}
现在在buildappConfiguration中,您会看到hostingConfiguration添加了AppConfiguration
private void BuildAppConfiguration()
{
var configBuilder = new ConfigurationBuilder();
//Here _hostConfiguration gets added ontop
configBuilder.AddConfiguration(_hostConfiguration);
foreach (var buildAction in _configureAppConfigActions)
{
buildAction(_hostBuilderContext, configBuilder);
}
_appConfiguration = configBuilder.Build();
_hostBuilderContext.Configuration = _appConfiguration;
}
现在,构建功能是私人的,无法从构建器重置/清晰的来源。
如果您不想实现自己的主机建筑商版本
因此,根据文档,webhostbuilder为您加载appsettings.json和appsettings.env.json文件。但这也没有说明主机构建者这样做,我相信这是由于缺乏文档,我无法确定来自源代码的何处。
要解决此问题,我更改了配置文件的设置方式。以前,我在appsettings.json文件以及appsettings.env.json文件中有连接字符串。因此,我对添加的配置文件的最后一个替换了基本配置文件的值的问题。我现在仅将基于环境的设置移至每个环境的配置文件中,并且仅保留了基本配置文件中所有环境的全局设置。
似乎是来自.NET框架配置转换设置的旧习惯。我无法确定是否应将来自多个提供商声明的IconFiguration中的相同键更改为最后一个加载的提供商,我认为一些文档涵盖了这一点并确认了这一点,但现在找不到。
2023 Update
请参阅样本.NET 7应用。
首先清除所有配置源,然后根据需要设置它们。
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// Clear Config sources
builder.Configuration.Sources.Clear();
// Add config sources from lowest priority to highest
builder.Configuration.AddJsonFile("mysettings.json");
builder.Configuration.AddEnvironmentVariables();
// Build and run app
var app = builder.Build();
app.MapGet("/", () => "Hello");
app.Run();