Доступ к httpcontext.request в конструкторе контроллера
-
26-09-2019 - |
Вопрос
Я следую по этому поводу Учебник MVC ASP.NET от Microsoft:
Мой код немного отличается, где я пытаюсь получить доступ HttpContext.Request.IsAuthenticated
в конструкторе контроллера.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
Проблема в том, что HttpContext
всегда нулевой.
Есть ли этому решение?
Решение
Контроллер существенно создается значительно до того, как вызывается действие индекса, и в момент строительства httpcontext действительно недоступен. Что не так с ссылкой на его методе контроллера Index
?
Другие советы
вместо того, чтобы положить свой HttpContext.Request.IsAuthenticated
В уровне контроллера вы должны поместить его в базовый класс контроллера, который будет унаследован во всем вашим контроллере с методом переопределения метода ONACTIEXECUTING ().
В базе контроллера вы должны иметь
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
но то, что вы сделали, вы указываете метод действий внутри вашего базового контроллера, который является ApplicationController
Таким образом, ваш метод индекса действий не будет вызван при вызове любой страницы (Page index), которая не от ApplicationController.
Я бы предложил вам использовать:
System.Web.HttpContext.Current.Request
Просто помни System.Web.HttpContext.Current
Это ThreadStatic, но если вы не используете дополнительную нить, решение работает.
Решение этой проблемы состоит в том, чтобы создать метод переопределения инициализации путем прохождения объекта 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;
}
}
}