【问题标题】:Override configuration with UseSetting使用 UseSetting 覆盖配置
【发布时间】:2020-01-07 08:28:52
【问题描述】:

我正在使用 .NET Core 2.2,默认模板并尝试使用 UseSetting 覆盖配置,但是我无法使其正常工作。在配置中设置的测试值到文件,我想在代码中用相同的值覆盖它,然后在启动中我想获得覆盖的值。

(最初我试图添加 AzureKeyVaultProvider,但它对我不起作用,我以这个示例结束)

配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Test": "file" 
}

程序.cs:

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>()
            .UseSetting("Test", "code");
}

Startup.cs:

public class Startup
{
    private readonly IConfiguration _configuration;

    public Startup(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        var value = _configuration.GetValue<string>("Test");
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.Run(async (context) =>
        {
            await context.Response.WriteAsync("Hello World!");
        });
    }
}

【问题讨论】:

  • UseSetting 适用于 host 配置,该配置在应用程序配置之前应用。你需要连接到ConfigureAppConfiguration
  • @KirkLarkin 最初我试图覆盖配置:WebHost.CreateDefaultBuilder(args).UseConfiguration(configuration),我希望这是覆盖配置的方式,但是当我检查源代码@987654328 @ 只是迭代配置键并为每个配置键调用 UseSetting。这就是为什么我希望 UseSetting 覆盖配置,而不仅仅是主机配置
  • 甚至在此之前,我试图根据此示例添加 AzureKeyVault:github.com/dotnet-architecture/eShopOnContainers/blob/dev/src/…。正在检索值,但不覆盖配置文件
  • 这不是我的问题的答案,因为我想使用 UseConfiguration 扩展名覆盖配置,如下所示:WebHost.CreateDefaultBuilder(args).UseConfiguration(configuration),但它解决了我原来的问题,所以我接受它
  • 问题还是一样,因为UseConfiguration 也适用于主机 正如你所说,它只是结束了UseSetting。主机配置被复制到应用程序配置中,因此它通常可以工作,您示例中的 JSON 文件会覆盖这些值。

标签: c# .net asp.net-core .net-core configuration


【解决方案1】:

UseSetting 应用于 host 配置,该配置在应用程序配置之前应用。在您的示例中,它是覆盖 UseSetting 值的 JSON 值。 UseSetting 在主机配置中设置值,该值被复制到应用程序配置中,然后被 JSON 值覆盖

使用ConfigureAppConfigurationAddInMemoryCollection 来达到预期的效果:

WebHost.CreateDefaultBuilder(args)
    .UseStartup<Startup>()
    .ConfigureAppConfiguration((ctx, configurationBuilder) =>
    {
        configurationBuilder.AddInMemoryCollection(new Dictionary<string, string>
        {
            ["Test"] = "code"
        });
    });

使用此设置,在调用 AddInMemoryCollection 时使用的值会覆盖 JSON、env 等中的所有其他值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-28
    • 2011-09-24
    • 2017-09-08
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多