如何自动及手动刷新.NET 8中的IConfiguration
.NET 8中Azure Key Vault配置的自动与手动刷新方案
一、自动刷新配置
在.NET 8中,Azure Key Vault配置提供器原生支持自动刷新,只需在配置阶段启用重载并设置刷新间隔:
1. 配置Azure Key Vault时启用自动刷新
在Program.cs中配置Key Vault时,通过AzureKeyVaultConfigurationOptions开启自动刷新:
var builder = WebApplication.CreateBuilder(args); builder.Configuration.AddAzureKeyVault( new Uri("https://你的密钥保管库名称.vault.azure.net/"), new DefaultAzureCredential(), new AzureKeyVaultConfigurationOptions { // 设置自动刷新间隔(示例为1小时) ReloadInterval = TimeSpan.FromHours(1), // 启用变更重载 ReloadOnChange = true }); // 注册配置类,使用IOptionsSnapshot/IOptionsMonitor获取最新值 builder.Services.Configure<MySettings>(builder.Configuration.GetSection("MySettings")); var app = builder.Build();
2. 正确获取刷新后的配置
不能使用IOptions<T>(单例模式,不会自动更新),需使用:
- IOptionsSnapshot
:范围作用域,每次请求都会获取最新配置值 - IOptionsMonitor
:全局作用域,可主动监听配置变更事件
示例服务中使用IOptionsMonitor<T>:
public class MyService { private readonly IOptionsMonitor<MySettings> _settingsMonitor; public MyService(IOptionsMonitor<MySettings> settingsMonitor) { _settingsMonitor = settingsMonitor; // 可选:监听配置变更事件 _settingsMonitor.OnChange(settings => { // 配置变更后的处理逻辑 Console.WriteLine("配置已更新"); }); } public void DoSomething() { // 获取最新配置值 var latestSettings = _settingsMonitor.CurrentValue; // ... 业务逻辑 } }
二、手动刷新配置
通过IConfigurationRoot的Reload()方法手动触发配置刷新,步骤如下:
1. 获取IConfigurationRoot实例
在需要触发刷新的地方(如API控制器),将注入的IConfiguration转换为IConfigurationRoot:
[ApiController] [Route("api/config")] public class ConfigController : ControllerBase { private readonly IConfigurationRoot _configRoot; public ConfigController(IConfiguration configuration) { _configRoot = (IConfigurationRoot)configuration; } [HttpPost("refresh")] public IActionResult ManualRefresh() { // 触发手动刷新 _configRoot.Reload(); return Ok("配置已手动刷新完成"); } }
2. 手动刷新后的联动
调用Reload()后,配置系统会触发变更事件,所有依赖IOptionsMonitor<T>的服务都会自动获取最新配置值,无需额外处理。
注意事项
- 权限要求:应用需拥有Azure Key Vault的
Secret Get和Secret List权限,确保能读取密钥并检测变更 - 刷新间隔:自动刷新间隔不宜过短,避免频繁调用Azure Key Vault API导致限流或额外开销
- 依赖版本:确保使用的
Azure.Extensions.AspNetCore.Configuration.Secrets包版本兼容.NET 8,推荐使用最新稳定版
内容的提问来源于stack exchange,提问作者Jck
相关产品推荐
相关产品推荐

