ASP.NET Identity V2在多线程中UserManager获取的httpContext.Current始终为null的解决办法

最近需要在Quartz一个定时器中没隔段时间执行一个操作,在这个过程当中需要获取到 ApplicationUserManager 对象。因为原来这些对象是在控制器中定义的,为了使用,特意把其挪到了定时任务操作类中。

    public ApplicationUserManager UserManager
        {
            get
            {
                return _userManager ?? httpContextBase.GetOwinContext().GetUserManager<ApplicationUserManager>();

            }
            private set
            {
                _userManager = value;
            }
        }
        /// <summary>
        /// 在controller.httpcontext为null时使用
        /// </summary>
        HttpContextBase httpContextBase
        {
            get
            {

                HttpContextWrapper context =
                    new HttpContextWrapper(System.Web.HttpContext.Current);
                return (HttpContextBase)context;
            }
        }

定时器中的使用语句:

var operatorModel = UserManager.Users.FirstOrDefault(m => m.IID == item.AdminId);

错误日志中爆出了这样的错误:

值不能为 null。
参数名: httpContext<

指向的语句是:new HttpContextWrapper(System.Web.HttpContext.Current);

这个错误原因是HttpContext.Current 是在web线程中才起作用。为什么可以在controller 所有地方可以用,因为整个 web 应用都是一个线程。而定时任务是新创建了一个线程,与web 线程不是一个,因此 HttpContext.Current 是 null。 

但是在网上搜索的,并没有好的解决办法。唯一一个说可以解决的,说是把 httpcontext.current 存到一个缓存中,然后在线程中使用。但是我看了写法,代码太多,感觉处理的好复杂,不想用。结合本次问题是有关ASP.NET Identity V2 的使用的。觉得我可以使用我刚刚发过的上篇文章  

ApplicationUserManager对象的两种创建方法

觉得可以使用这两种创建方法的第二种解决此问题。解决代码如下:


private LMIdentityDbContext _db = new IdentityDbContext();
        protected ApplicationUserManager userManager
        {
            get
            {
                var store = new UserStore<ApplicationUser>(_db);
                return _userManager ?? new ApplicationUserManager(store);

            }
            private set
            {
                _userManager = value;
            }
        }

使用方法:

var operatorModel = userManager.Users.FirstOrDefault(m => m.IID == item.AdminId);

这次经过测试,没有问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值