Hangfire自定义授权过滤器每秒多次执行问题求助
解决Hangfire Dashboard自定义授权过滤器每秒执行的问题
嘿,这个问题我之前也碰到过!其实原因很简单——Hangfire Dashboard本身自带自动刷新机制,默认情况下它每秒都会向服务器发送请求,用来更新任务列表、运行统计这些实时数据。而每一次这个刷新请求过来,都会触发你的自定义授权过滤器的Authorize方法,所以就出现了每秒执行一次的情况,和你有没有做空值检查没关系哦。
那怎么处理呢?给你几个实用的方案:
- 调整自动刷新间隔:这是最直接的办法。你可以在配置Hangfire Dashboard的时候,通过
DashboardOptions的PollingInterval参数把刷新间隔调大,比如改成5秒或者更久,这样过滤器的执行频率就会跟着降低。代码示例如下:
app.UseHangfireDashboard("/hangfire", new DashboardOptions { Authorization = new[] { new CustomAuthorizationFilter() }, PollingInterval = TimeSpan.FromSeconds(5) // 按需调整间隔时间 });
- 优化授权检查逻辑:既然避免不了每次请求都要执行授权检查,那我们可以让这个检查更高效。比如如果用户的角色不会频繁变化,可以把角色检查的结果缓存起来,减少每次检查的开销。修改后的过滤器代码可以参考:
public class CustomAuthorizationFilter : IDashboardAuthorizationFilter { public bool Authorize(DashboardContext context) { var httpContext = HttpContext.Current; if (httpContext?.User == null) return false; // 这里可以用Session或者内存缓存来存储角色检查结果 var cacheKey = $"UserIsAdmin_{httpContext.User.Identity.Name}"; if (HttpRuntime.Cache[cacheKey] == null) { var isAdmin = httpContext.User.IsInRole("Admin"); HttpRuntime.Cache.Insert(cacheKey, isAdmin, null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration); } return (bool)HttpRuntime.Cache[cacheKey]; } }
- (不推荐)区分请求类型:如果你实在不想让刷新请求走完整授权,可以判断请求的路径是否是Dashboard的API接口(比如
/hangfire/api/stats这类),但这里不建议这么做——毕竟授权检查是保证Dashboard安全的关键,哪怕是内部刷新请求也应该保持校验。
总的来说,这个情况不是你的过滤器代码有问题,只是Hangfire Dashboard的默认行为导致的,调整刷新间隔或者优化逻辑就能解决啦。
内容的提问来源于stack exchange,提问作者Jaczura Zoltán
相关产品推荐
相关产品推荐

