在 ASP.NET MVC 操作方法内部调用时,Hangfire 作业未触发
Hangfire job not firing when called inside of ASP.NET MVC Action method
当将 hangfire 作业放入 MVC 中的 Index 方法中时,它不会启动。我不明白为什么。
[HttpGet]
public IActionResult Index()
{
RecurringJob.AddOrUpdate(() => GetCurrentUserNotifications(User.Identity.Name), Cron.MinuteInterval(1));
return View(vm);
}
public void GetCurrentUserNotifications(string userId)
{
_connectionManager.GetHubContext<NotificationsHub>()
.Clients.All.broadcastNotifications(_repository.GetNotifications()
.Where(x => x.DateTime <= DateTime.Now && x.CreatedBy == userId));
}
问题是你的方法 GetCurrentUserNotifications(string userId)
是你的控制器的方法 class。当 Hangfire 执行作业时,它会尝试创建控制器实例 class。但我相信您的控制器 class 没有无参数构造函数。因此它将无法执行该作业。
解决方案是创建一个单独的 class,例如 BackgroundProcess
。将你的 GetCurrentUserNotifications
放入其中,然后像下面这样调用:
RecurringJob.AddOrUpdate(() => new BackgroundProcess().GetCurrentUserNotifications(User.Identity.Name), Cron.MinuteInterval(1));
当将 hangfire 作业放入 MVC 中的 Index 方法中时,它不会启动。我不明白为什么。
[HttpGet]
public IActionResult Index()
{
RecurringJob.AddOrUpdate(() => GetCurrentUserNotifications(User.Identity.Name), Cron.MinuteInterval(1));
return View(vm);
}
public void GetCurrentUserNotifications(string userId)
{
_connectionManager.GetHubContext<NotificationsHub>()
.Clients.All.broadcastNotifications(_repository.GetNotifications()
.Where(x => x.DateTime <= DateTime.Now && x.CreatedBy == userId));
}
问题是你的方法 GetCurrentUserNotifications(string userId)
是你的控制器的方法 class。当 Hangfire 执行作业时,它会尝试创建控制器实例 class。但我相信您的控制器 class 没有无参数构造函数。因此它将无法执行该作业。
解决方案是创建一个单独的 class,例如 BackgroundProcess
。将你的 GetCurrentUserNotifications
放入其中,然后像下面这样调用:
RecurringJob.AddOrUpdate(() => new BackgroundProcess().GetCurrentUserNotifications(User.Identity.Name), Cron.MinuteInterval(1));