Acessando HttpContext.request no construtor de um controlador
-
26-09-2019 - |
Pergunta
Estou seguindo isso ASP.NET MVC Tutorial da Microsoft:
Meu código é um pouco diferente, onde estou tentando acessar HttpContext.Request.IsAuthenticated
no construtor do controlador.
namespace SCE.Controllers.Application
{
public abstract class ApplicationController : Controller
{
public ApplicationController()
{
bool usuario = HttpContext.Request.IsAuthenticated;
}
}
}
O problema é que HttpContext
é sempre nulo.
Existe uma solução para isso?
Solução
O controlador é instanciado significativamente antes do ponto em que a ação do índice é invocada e, no momento da construção, o HttpContext está realmente indisponível. O que há de errado em referenciá -lo no seu método do controlador Index
?
Outras dicas
Em vez de colocar o seu HttpContext.Request.IsAuthenticated
No nível do controlador, você deve colocá -lo na classe base do controlador que será herdada em todo o seu controlador com um método de substituição do método onactionExecuting ().
Na sua base de controladores, você deve ter
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext ctx) {
base.OnActionExecuting(ctx);
ViewData["IsAuthenticated"] = HttpContext.Request.IsAuthenticated;
}
}
E todo o seu controlador deve herdar a classe do controlador de base
public class ApplicationController : BaseController
Agora você deve pegar o ViewData["IsAuthenticated"]
em sua página mestre.
Editar
Com o link que você deu e relacionado ao que você fez, seu ApplicationController
é um controlador de página, não um controlador base. No exemplo, ApplicationController
é um controlador base herdado pelo HomeController
Mas o que você fez é que está colocando o método de ação dentro do seu controlador base, que é o ApplicationController
Portanto, seu método de índice de ação não será chamado quando você ligar para qualquer página (página de índice) que não seja do ApplicationController.
Eu sugeriria que você use:
System.Web.HttpContext.Current.Request
Apenas lembra-te System.Web.HttpContext.Current
é threadstatic, mas se você não usar thread adicional, a solução funciona.
A solução desse problema é criar um método de substituição de inicialização ao aprovar o objeto 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;
}
}
}