tag net mvc component asp asp.net-mvc httpcontext controllers

asp.net mvc - net - accediendo a HttpContext.Request en el constructor de un controlador



forms asp net core (4)

El Controlador se crea una instancia significativa antes del punto en que se invoca la acción del Índice, y en el momento de la construcción, HttpContext no está disponible. ¿Qué hay de malo en referenciarlo en el Index su método de controlador?

Estoy siguiendo este tutorial ASP.NET MVC de Microsoft :

Mi código es ligeramente diferente, donde intento acceder a HttpContext.Request.IsAuthenticated en el constructor del controlador.

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

El problema es que HttpContext siempre es nulo.

¿Hay una solución para esto?


La solución de este problema es crear un método de anulación de Inicializar pasando el 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; } } }


Te sugiero que uses:

System.Web.HttpContext.Current.Request

Solo recuerde System.Web.HttpContext.Current es threadstatic, pero si no usa un hilo adicional, la solución funciona.


en lugar de colocar su HttpContext.Request.IsAuthenticated en el nivel del Controlador, debe colocarlo en la clase Base del Controlador que se heredará en todos sus controladores con un método de anulación del método OnActionExecuting ().

En tu base de controladores deberías tener

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

y todo su controlador debería heredar la clase BaseController

public class ApplicationController : BaseController

ahora debería obtener ViewData["IsAuthenticated"] en su página maestra.

Editar

Con el enlace que ha proporcionado, y en relación con lo que ha hecho, su controlador de ApplicationController es un controlador de página, no un controlador base. En el ejemplo, ApplicationController es un controlador base que es heredado por HomeController pero lo que has hecho es colocar el método de acción dentro de tu controlador base, que es el controlador de ApplicationController por lo que no se invocará tu método de índice de acción cuando llames a cualquier página ( Página de índice) que no es del ApplicationController.