将System.Web.HttpContext.Current转换为System.Web.HttpContextBase

时间:2016-07-07 03:28:12

标签: asp.net .net asp.net-mvc asp.net-mvc-5

我需要从我的一个控制器的构造函数中访问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中时,HttpContextController类的属性,类型为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

1 个答案:

答案 0 :(得分:11)

是的,有:

HttpContextBase httpContext = new HttpContextWrapper(HttpContext.Current);

是的,HttpContext在构造控制器期间始终为null。您可以在Controller.Initialize method

之前(及之后)安全地使用它
  

初始化调用构造函数时可能无法使用的数据。