我正进入(状态
“在先前的异步操作完成之前,第二个操作已在此上下文上启动”
使用asp.net身份2.1的MVC项目中间歇出现错误。基本上,我有一个基础控制器,每个其他控制器都派生自该基础控制器,并且该控制器具有返回ApplicationUser的属性。(asp.net身份用户的扩展类)。基本控制器具有以下功能。请注意,UserManager是从OwinContext检索的(是的,它是通过使用
CreatePerOwinContext()
方法,就像在模板中一样。
protected ApplicationUser ApplicationUser
{
get
{
var userId = User.Identity.GetUserId();
var applicationUser = UserManager.FindById(userId);
if (applicationUser == null)
{
return null;
}
return applicationUser;
}
}
protected ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
set
{
_userManager = value;
}
}
然后在其他控制器中,我自由调用此属性以获取对ApplicationUser的引用,示例如下
public ActionResult Index()
{
if (Request.IsAuthenticated)
{
var model = new OrganizationListViewModel(false)
{
OrganizationDetailViewModels = ApplicationUser.Affiliations
.Select(e => new OrganizationDetailViewModel(
e.Organization, ApplicationUser)).ToList()
};
return View(model);
}
else
{
return RedirectToAction("Search", "Search", new { type = "organization" });
}
}
这有时可行,有时会出现我提到的错误。我没有在属性或控制器方法中调用异步操作。所以我很困惑。有任何想法吗?
我怀疑这行:
OrganizationDetailViewModels = ApplicationUser.Affiliations
.Select(e => new OrganizationDetailViewModel(
e.Organization, ApplicationUser)).ToList()
在这里,您对进行请求ApplicationUser
,然后进行lazy-load Affiliations
,然后对于其中的每个选择再次Affiliations
进行请求ApplicationUser
。
对ApplicationUser
进行本地缓存,以避免对仅要求一个的DB发出多个请求:
private ApplicationUser _cachedUser;
protected ApplicationUser ApplicationUser
{
get
{
var userId = User.Identity.GetUserId();
if (_cachedUser == null)
{
var applicationUser = UserManager.FindById(userId);
return applicationUser;
}
return _cachedUser;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句