Подтвердить что ты не робот

Доступ к HttpContext.Request в конструкторе контроллера

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

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

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

Проблема заключается в том, что HttpContext всегда null.

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

4b9b3361

Ответ 1

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

Ответ 2

вместо того, чтобы поместить ваш 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, поэтому ваш метод Index Index не будет вызван когда вы вызываете любую страницу (страницу индекса), которая не принадлежит ApplicationController.

Ответ 3

Я предлагаю вам использовать:

 System.Web.HttpContext.Current.Request

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

Ответ 4

Решение этой проблемы заключается в создании метода переопределения 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;
        }
    }
}