ASP.NET 7本地应用:如何在Azure App Configuration更新时触发额外代码
纯应用端解决方案:利用配置刷新事件监听Sentinel键变化
你可以直接借助Azure App Configuration客户端提供的RefreshCompleted事件,结合对Sentinel键值的对比,实现仅当Sentinel键变化并触发配置实际更新时执行额外代码,无需依赖EventGrid。
实现步骤
确保动态更新配置已正确初始化
先确认你的Program.cs中已经配置了AAC动态更新,并且注册了Sentinel键:var builder = WebApplication.CreateBuilder(args); builder.Configuration.AddAzureAppConfiguration(options => { options.Connect("你的AAC连接字符串") .ConfigureRefresh(refresh => { // 注册Sentinel键,设置refreshAll: true确保变化时刷新所有配置 refresh.Register("SentinelKey", refreshAll: true) .SetCacheExpiration(TimeSpan.FromMinutes(5)); }); }); // 注入AAC配置刷新服务 builder.Services.AddAzureAppConfiguration();监听RefreshCompleted事件并判断Sentinel变化
在应用启动后,获取IConfigurationRefresher实例,注册刷新完成事件,对比Sentinel键的前后值:var app = builder.Build(); // 获取配置刷新器实例 var refresherProvider = app.Services.GetRequiredService<IConfigurationRefresherProvider>(); var aacRefresher = refresherProvider.Refreshers.First(); // 记录初始Sentinel值 string lastSentinelValue = app.Configuration["SentinelKey"]; aacRefresher.RefreshCompleted += (sender, args) => { // 仅在刷新成功时处理 if (args.Succeeded) { string currentSentinelValue = app.Configuration["SentinelKey"]; // 对比Sentinel值是否变化 if (currentSentinelValue != lastSentinelValue) { // 执行你的额外业务代码 Console.WriteLine("Sentinel键已更新,触发额外操作"); // 更新记录的Sentinel值,用于下次对比 lastSentinelValue = currentSentinelValue; } } }; // 其他中间件配置... app.Run();
进阶:在业务服务中监听
如果需要在业务服务中处理该逻辑,可以通过依赖注入获取IConfiguration和IConfigurationRefresherProvider:
public class ConfigUpdateHandler { private readonly IConfiguration _configuration; private string _lastSentinelValue; public ConfigUpdateHandler(IConfiguration configuration, IConfigurationRefresherProvider refresherProvider) { _configuration = configuration; _lastSentinelValue = _configuration["SentinelKey"]; var refresher = refresherProvider.Refreshers.First(); refresher.RefreshCompleted += OnConfigRefreshed; } private void OnConfigRefreshed(object sender, RefreshCompletedEventArgs args) { if (args.Succeeded) { string currentSentinel = _configuration["SentinelKey"]; if (currentSentinel != _lastSentinelValue) { // 执行自定义逻辑,比如重新加载配置依赖、通知其他服务等 // ... _lastSentinelValue = currentSentinel; } } } }
关键注意事项
- 确保
Register("SentinelKey", refreshAll: true)的refreshAll参数设为true,这样Sentinel键变化时会触发全量配置刷新。 - 通过
args.Succeeded判断刷新是否成功,避免在配置刷新失败时执行无效操作。 - 如果存在多个配置刷新器(比如同时配置了多个AAC实例),需要通过筛选确保获取到目标刷新器。
内容的提问来源于stack exchange,提问作者darkallday76
相关产品推荐
相关产品推荐

