首页 > 解决方案 > 如何将自定义配置处理器注入 WebHost.CreateDefaultBuilder?

问题描述

我的 Program.cs 文件中有一个非常标准的 ASP.NET Core Web 应用程序初始化代码片段:

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
            logging.AddSerilog(dispose: true);
        })
        .UseSerilog((ctx, config) => { config.ReadFrom.Configuration(ctx.Configuration); })
        .UseStartup<Startup>();

我想插入我的自定义配置拦截器,它读取并替换配置的当前最终组合值,但我不明白该怎么做。

正如我们从 Microsoft 文档中了解到的,CreateDefaultBuilder 使用特定于环境的 json 覆盖 appsettings.json,最后使用环境变量和命令行参数覆盖它。我想在最后一步之后立即注入我的自定义代码,这样我就可以在将值进一步传递给 Startup with 之前拦截和修改它们public IConfiguration Configuration { get; }

我在 ASP.NET Core 源代码中发现了一个有趣的函数:

ConfigureAppConfiguration((hostingContext, config) =>

它结合了所有来源。我不想完全覆盖它,我只想在ConfigureAppConfiguration完成其工作之后但在我的 Startup 接收配置值之前附加我自己的配置转换。

我怎么做?

更多信息以提供一些上下文:

目标是为配置值注入自定义解密例程,这些配置值可能在这三个位置中的任何一个位置被加密——appsettings.json、环境 json、环境变量。我只找到了通过自定义配置提供程序为 appsettings.json 实现加密的答案,但没有找到在所有组合源之后注入我的解密例程的答案。

我不是要求加密/解密例程本身(我已经拥有它们),而是要求一种解决方案,用于注入接收配置值的函数调用以用我的解密值覆盖。

标签: c#asp.net-coreconfiguration

解决方案


如果我猜对了,您想IConfiguration通过阅读原始资料并解密来获得您的资料吗?

然后你可以使用这样的东西:

return WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration(builder =>
                {
                    // Build an IConfiguration from the currently added IConfigurationSources
                    var notEncrypted = builder.Build();

                    // Clear the currently added ones
                    builder.Sources.Clear();

                    // Add you own IConfigurationSource with the previously added IConfiguration to read all values in the encrypted form.
                    var yourConfugurationSource = new < EncryptedConfigurationSource > (notEncrypted)

                    // Add your IConfigurationSource to the App 
                    // Now every call to IConfiguration takes your source
                    builder.Add(yourConfugurationSource);
                })
                .Build();

就像一个评论。最后添加的IConfigurationSource将作为第一个值。如果这足够你不需要清除自动添加IConfigurationSource的s


推荐阅读