在控制器的构造函数中访问HttpContext.Request

时间:2010-08-08 01:01:27

标签: asp.net-mvc httpcontext controllers

我正在关注此ASP.NET MVC tutorial from Microsoft

我的代码略有不同,我试图在控制器的构造函数中访问HttpContext.Request.IsAuthenticated

namespace SCE.Controllers.Application
{
    public abstract class ApplicationController : Controller
    {
        public ApplicationController()
        {
            bool usuario = HttpContext.Request.IsAuthenticated;
        }           
    }
}

问题是HttpContext始终为空。

有解决方法吗?

4 个答案:

答案 0 :(得分:101)

而不是将你的HttpContext.Request.IsAuthenticated置于Controller级别,你应该把它放在Controller Base类中,它将在你的所有控制器中使用OnActionExecuting()方法的覆盖方法继承。

在您的控制器基础中,您应该

public class BaseController : Controller
{
    protected override void OnActionExecuting(ActionExecutingContext ctx) {
        base.OnActionExecuting(ctx);
        ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
    }
}

并且所有Controller都应该继承BaseController类

public class ApplicationController : BaseController

现在您应该在主页面中获得ViewData["IsAuthenticated"]

修改

通过您提供的链接以及与您所做的相关的链接,ApplicationController是页面控制器,而不是基本控制器。在示例中,ApplicationController是由HomeController继承的基本控制器,但您所做的是将Action方法放在基本控制器中ApplicationController,这样您的Action当您调用不是来自ApplicationController的任何页面(索引页面)时,将不会调用索引方法。

答案 1 :(得分:48)

我建议你使用:

 System.Web.HttpContext.Current.Request

请记住System.Web.HttpContext.Current是线程静止的,但如果您不使用其他线程,则解决方案可以正常工作。

答案 2 :(得分:9)

Controller在调用Index操作之前显着实例化,并且在构造时HttpContext确实不可用。在控制器方法Index中引用它有什么问题?

答案 3 :(得分:8)

此问题的解决方案是通过传递RequestContext对象来创建Initialize的覆盖方法。

public class ChartsController : Controller
{
     bool isAuthed = false;
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);

        if (requestContext.HttpContext.User.Identity.IsAuthenticated)
        {
          isAuthed =true;
        }
    }
}