设置Hangfire成功的作业到期属性不起作用

我正在使用Hangfire来做工作,我想改变一天后从数据库中删除成功作业的行为 – 我希望它们存储一年。

按照此线程中的说明,这与此SO问题中的相同,我创建了一个类:

public class OneYearExpirationTimeAttribute : JobFilterAttribute, IApplyStateFilter { public void OnStateUnapplied(ApplyStateContext context, IWriteOnlyTransaction transaction) { context.JobExpirationTimeout = TimeSpan.FromDays(365); } public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction transaction) { context.JobExpirationTimeout = TimeSpan.FromDays(365); } } 

我在我的Asp.net web api启动类中将其注册为全局filter:

 public class Startup { public void Configuration(IAppBuilder app) { // ... other stuff here ... GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute()); GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection"); app.UseHangfireDashboard(); } } 

web api是发布作业的地方(即,调用BackgroundJob.Enqueue(() => ...) )。 我没有更改执行实际作业的客户端的配置。

如果我现在发布一个作业并且成功,它仍然有一天的到期时间,如截图中所示,它显示了仪表板和HangfireDb中的条目,

在此处输入图像描述

我做错了什么或我错过了什么?

我在设置中的错误是该属性设置在错误的应用程序上。 正如我在问题中所述,我在asp.net web api的startup.cs文件中添加了filter,其中发布了作业。

相反,我应该在正在执行作业的控制台应用程序中添加配置,即我的控制台应用程序以

 static void Main(string[] args) { GlobalConfiguration.Configuration.UseSqlServerStorage("HangFireDBConnection"); GlobalJobFilters.Filters.Add(new OneYearExpirationTimeAttribute()); // ... more stuff ... } 

然后它工作。 Hangfire文档可能会更清楚地说明应该配置filter的位置。