.Net Core ConfigureAppConfiguration添加了覆盖环境特定设置的其他源

时间:2018-12-20 16:52:24

标签: c# .net configuration .net-core azure-webjobssdk

在具有通用主机的.NET Core 2.1应用程序中使用IConfigurationBuilder时,我配置了4个源。但是在ConfigureAppConfiguration的范围之后,有6个来源。

在某些时候,第二次添加了我已经加载的其他源,其顺序导致导致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.environment.json之前声明的环境变量的重复项。

现在,当将注入到类中时,最后添加的appsettings.json设置会通过appsettings.environment.json返回

4 个答案:

答案 0 :(得分:3)

可以重新排序 init: function () { var countType = fnDocumentTypeCount(GroupId); console.log(countType); } 以满足您的需要。例如,这里有一个扩展方法,您可以使用它在最后一个文件之后添加一个新的 JSON 文件,而不是在最后:

builder.Sources

然后你可以像这样使用它:

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;
  }
}

您可以根据自己的需要进行调整,并将其插入到您需要的任何位置。

答案 1 :(得分:1)

阅读Hostbuilder.cs类的源代码,您将发现AddHostingConfiguration中添加的Configuration已添加到ApplicationConfiguration中。

让我告诉你,您可以在https://github.com/aspnet/AspNetCore/blob/1c3fa82908fe2cb773626b6613843213286a482b/src/Microsoft.Extensions.Hosting/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;
    }

现在Build功能是私有的,无法重置/清除来自构建器的源。

如果您不想实现自己的HostBuilder版本,建议不要将主机设置与Appsettings分开

答案 2 :(得分:0)

因此,根据文档,WebHostBuilder会为您加载appSettings.json和appSettings.env.json文件。但是它也没有说出HostBuilder这样做的任何信息,我认为这是由于缺乏文档所致,而且我无法确定源代码在哪里。

要解决此问题,我更改了配置文件的设置方式。以前,我在appSettings.json文件和appSettings.env.json文件中都有连接字符串。所以我在最后一次添加配置文件时替换了基本配置文件中的值时遇到了问题。现在,我仅将基于环境的设置移到了每个环境的配置文件中,并且只将对所有环境都全局的设置保留在基本配置文件中。

.NET框架配置转换设置中的旧习惯似乎很难消亡。我无法确定是否应将多个提供者声明的IConfiguration中的同一密钥更改为上次加载的提供者,我认为有些文档对此进行了说明并确认了这一点,但现在找不到。

答案 3 :(得分:0)

  

但是添加了两个额外的来源,它们是appsettings.json和环境变量的重复内容

我在使用HostBuilder的Azure WebJob上遇到了类似的问题,并注意到这两个源已附加到配置源列表的末尾。这产生了不良结果:appsettings.json的开发设置覆盖了appsettings.Production.json的生产设置。

ConfigureWebJobs的这些其他来源appear to be added here

解决方法是对HostBuilder调用链进行重新排序,以使对ConfigureWebJobs的调用早于对ConfigureAppConfiguration的调用。这两个额外的来源仍然存在,但是由于它们现在位于配置来源列表的开头而不是结尾,因此它们不会产生不良影响。