我已经在我的 .NET Core Web 应用程序的 Startup 类中安装并配置了 Hangfire,如下所示(删除了很多非 Hangfire 代码):
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseHangfireServer();
//app.UseHangfireDashboard();
//RecurringJob.AddOrUpdate(() => DailyJob(), Cron.Daily);
}
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.Configure<AppSettings>(Configuration);
services.AddSingleton<IConfiguration>(Configuration);
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddScoped<IPrincipal>((sp) => sp.GetService<IHttpContextAccessor>().HttpContext.User);
services.AddScoped<IScheduledTaskService, ScheduledTaskService>();
services.AddHangfire(x => x.UseSqlServerStorage(connectionString));
this.ApplicationContainer = getWebAppContainer(services);
return new AutofacServiceProvider(this.ApplicationContainer);
}
}
public interface IScheduledTaskService
{
void OverduePlasmidOrdersTask();
}
public class ScheduledTaskService : IScheduledTaskService
{
public void DailyJob()
{
var container = getJobContainer();
using (var scope = container.BeginLifetimeScope())
{
IScheduledTaskManager scheduledTaskManager = scope.Resolve<IScheduledTaskManager>();
scheduledTaskManager.ProcessDailyJob();
}
}
private IContainer getJobContainer()
{
var builder = new ContainerBuilder();
builder.RegisterModule(new BusinessBindingsModule());
builder.RegisterModule(new DataAccessBindingsModule());
return builder.Build();
}
}
如您所见,我正在使用 Autofac 进行 DI。每次执行 Hangfire 作业时,我都会进行设置以注入一个新容器。
目前,我已经UseHangfireDashboard()
注释掉了添加我的经常性工作的调用,并且我在引用的行上收到以下错误IPrincipal
:
System.NullReferenceException:“对象引用未设置为对象的实例。”
我了解 Hangfire 没有HttpContext
. 我不确定为什么它甚至会为 Hangfire 线程触发那行代码。我最终将需要为我的 IPrincipal 依赖项解析一个服务帐户。
如何解决 Hangfire 和 HttpContext 的问题?