.NET Core ConfigureAppConfiguration添加了其他特定环境设置的其他资源



在使用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();

相关内容

  • 没有找到相关文章

最新更新