我需要从我的一个控制器的构造函数中访问OwinContext,如下所示:
protected SEMController()
{
var currentUserIsAdmin = false;
var currentUserName = System.Web.HttpContext.Current.User?.Identity?.Name;
if (!string.IsNullOrEmpty(currentUserName))
{
var user = UserManager.Users
.SingleOrDefault(u =>
u.UserName.Equals(currentUserName,
StringComparison.InvariantCultureIgnoreCase));
if (user != null)
{
currentUserIsAdmin = UserManager.IsInRole(user.Id, UserType.Admin);
}
}
TempData["CurrentUserIsAdmin"] = currentUserIsAdmin;
}
其中UserManager
是同一个控制器的属性,它看起来像这样:
public ApplicationUserManager UserManager
{
get
{
if (_userManager == null)
{
_userManager = HttpContext.GetOwinContext()
.GetUserManager<ApplicationUserManager>();
}
return _userManager;
}
private set
{
_userManager = value;
}
}
但是,当代码在ctor中时,HttpContext
是Controller
类的属性,类型为System.Web.HttpContextBase
且不是{{1}实例,是null。
但是,无论如何,ASP.NET框架只是将信息从一个地方复制到另一个地方,他们将在稍后的某个时间点获得的信息将是相同的。
所以,我想知道是否可以直接使用System.Web.HttpContext
属性来获取对OwinContext
的引用。但是,该属性的类型为System.Web.HttpContext.Current
,其中System.Web.HttpContext
是类型GetOwinContext
上的扩展方法,我发现这两个类彼此无关。
所以,我想知道是否有办法从System.Web.HttpContextBase
转到System.Web.HttpContext.Current
?
答案 0 :(得分:11)
是的,有:
HttpContextBase httpContext = new HttpContextWrapper(HttpContext.Current);
是的,HttpContext
在构造控制器期间始终为null。您可以在Controller.Initialize
method。
初始化调用构造函数时可能无法使用的数据。