HangFire执行作业时HttpContext.Current为null,是否需注入及如何操作?
HangFire中调用UserManager的正确姿势(替代HttpContext.Current)
绝对不要注入HttpContext.Current
HangFire的后台作业是脱离Web请求上下文执行的,HttpContext本身就不存在,强行注入会引发不可预测的错误,甚至导致内存泄漏,完全没必要这么做。正确实现方式
有两种可靠的方法可以调用UserManager.FindAsync():直接依赖注入UserManager
在你的作业类中通过构造函数注入UserManager<TUser>,完全不需要依赖HttpContext。示例代码:public class UserBackgroundJob { private readonly UserManager<ApplicationUser> _userManager; public UserBackgroundJob(UserManager<ApplicationUser> userManager) { _userManager = userManager; } public async Task ProcessUserAsync(string userId) { var user = await _userManager.FindByIdAsync(userId); // 执行后续业务逻辑 } }只要你的DI容器已经正确注册了
UserManager,HangFire会自动从容器中解析这个依赖。触发作业时传递用户标识
在Web请求上下文内(此时能正常获取用户信息),直接把用户ID作为参数传入HangFire作业,而不是试图从后台上下文获取。示例代码:// 在Controller或有HttpContext的代码中触发作业 var userId = User.Identity.GetUserId(); BackgroundJob.Enqueue<UserBackgroundJob>(job => job.ProcessUserAsync(userId));
额外注意
确保UserManager依赖的服务(比如DbContext)在HangFire的执行环境中是可用的,避免出现服务被过早释放的问题。如果是ASP.NET Core项目,要确保HangFire配置时使用了正确的服务提供程序:services.AddHangfire(config => config.UseSqlServerStorage(Configuration.GetConnectionString("HangFireConnection"))); services.AddHangfireServer();
内容的提问来源于stack exchange,提问作者Hamza Abu Yazan
相关产品推荐
相关产品推荐

