c# - 如何将自定义配置处理器注入 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 实现加密的答案,但没有找到在所有组合源之后注入我的解密例程的答案。
我不是要求加密/解密例程本身(我已经拥有它们),而是要求一种解决方案,用于注入接收配置值的函数调用以用我的解密值覆盖。
解决方案
如果我猜对了,您想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
推荐阅读
- python - discord.py 将语音频道中的所有人静音
- r - SApply 说当我相信一个论点确实存在时
- python - Visual Studio Code 中的 Python 库
- r - 25,26 和 27 小时的小数计算时间
- javascript - 在可滚动元素中使用浏览器后退按钮进行导航
- android - 我是否需要在我的应用程序的每个活动中添加 Firebase 分析代码?
- python - kivy:滚动视图滑动事件中的轮播变得很难
- python - 当我在不同的文件中访问某个函数时,我收到一条错误消息,指出该函数未定义
- c - GDB 仍然显示变量
即使在 gcc (v7 & v9.3.1) -O0 优化关闭之后 - javascript - threejs glft 模型奇怪的线条