ASP.NET Identity V2在多线程中UserManager获取的httpContext.Current始终为null的解决办法
2017-07-24 17:19
591 查看
最近需要在Quartz一个定时器中没隔段时间执行一个操作,在这个过程当中需要获取到 ApplicationUserManager 对象。因为原来这些对象是在控制器中定义的,为了使用,特意把其挪到了定时任务操作类中。
定时器中的使用语句:
错误日志中爆出了这样的错误:
值不能为 null。
参数名: httpContext<
指向的语句是:new HttpContextWrapper(System.Web.HttpContext.Current);
这个错误原因是HttpContext.Current 是在web线程中才起作用。为什么可以在controller 所有地方可以用,因为整个 web 应用都是一个线程。而定时任务是新创建了一个线程,与web 线程不是一个,因此 HttpContext.Current 是 null。
但是在网上搜索的,并没有好的解决办法。唯一一个说可以解决的,说是把 httpcontext.current 存到一个缓存中,然后在线程中使用。但是我看了写法,代码太多,感觉处理的好复杂,不想用。结合本次问题是有关ASP.NET Identity V2 的使用的。觉得我可以使用我刚刚发过的上篇文章
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);
这次经过测试,没有问题了
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对象的两种创建方法
觉得可以使用这两种创建方法的第二种解决此问题。解决代码如下:
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);
这次经过测试,没有问题了
相关文章推荐
- 多线程中使用HttpContext.Current为null的解决办法
- 多线程中使用HttpContext.Current为null的解决办法
- WCF Service中HttpContext.Current为null的解决办法
- WCF Service中HttpContext.Current为null的解决办法
- WCF Service中HttpContext.Current为null的解决办法
- 一般处理程序中 httpContext.current.session为null的解决办法
- WCF Service中HttpContext.Current为null的解决办法
- WCF Service中HttpContext.Current为null的解决办法
- [转]WCF Service中HttpContext.Current为null的解决办法
- 在IIS7下使用HttpModule的过程中遇到很诡异的问题,HttpContext.Current.User为NULL
- ASP.NET多线程下使用HttpContext.Current为null解决方案
- HttpContext.Session==null 解决办法
- System.Web.HttpContext.Current.Session为NULL解决方法
- HttpContext.Current.User is null after installing .NET Framework 4.5
- 异步 HttpContext.Current 为空null 另一种解决方法
- HttpContext.Current.User.Identity.Name 有时获取值不成功
- 解决Asp.net Mvc中使用异步的时候HttpContext.Current为null的方法
- 一例应用Microsoft.AspNet.Identity初始化角色权限导致的UserManager.GetRoles(user.Id)始终获取不到账号角色问题的解决
- ASP.NET多线程下使用HttpContext.Current为null解决方案
- 集成平台自动登入+C# Login控件,造成的HttpContext.Current.User.Identity.Name 为空问题解决方案