доступ к HttpContext.Request в конструкторе контроллера - PullRequest
49 голосов
/ 08 августа 2010

Я следую этому учебнику ASP.NET MVC от Microsoft :

Мой код немного отличается, где я пытаюсь получить доступ к HttpContext.Request.IsAuthenticated в конструкторе контроллера.

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

Проблема в том, что HttpContext всегда равен нулю.

Есть ли решение для этого?

Ответы [ 4 ]

102 голосов
/ 08 августа 2010

вместо того, чтобы поместить HttpContext.Request.IsAuthenticated в уровень контроллера, вы должны поместить его в базовый класс контроллера, который будет унаследован во всех ваших контроллерах с помощью метода переопределения метода OnActionExecuting ().

В базе вашего контроллерау вас должно быть

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

и весь ваш контроллер должен наследовать класс BaseController

public class ApplicationController : BaseController

, теперь вы должны получить ViewData["IsAuthenticated"] на своей главной странице.

Редактировать

По указанной вами ссылке и касающейся того, что вы сделали, ваш ApplicationController является Контроллером страниц, а не Базовым контроллером.В этом примере ApplicationController является базовым контроллером, который наследуется HomeController, но вы сделали то, что вы помещаете метод Action в базовый контроллер, который является ApplicationController, поэтому ваш метод индекса действия не будет вызыватьсякогда вы вызываете любую страницу (страница индекса), которая не из ApplicationController.

49 голосов
/ 09 июля 2013

Я бы предложил вам использовать:

 System.Web.HttpContext.Current.Request

Просто помните, System.Web.HttpContext.Current является потоковым, но если вы не используете дополнительный поток, решение работает.

9 голосов
/ 08 августа 2010

Контроллер создается значительно раньше точки, где вызывается действие Index, и в момент построения HttpContext действительно недоступен.Что плохого в том, чтобы ссылаться на него в методе вашего контроллера Index?

8 голосов
/ 29 февраля 2016

Решением этой проблемы является создание переопределенного метода Initialize путем передачи объекта RequestContext.

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;
        }
    }
}
...