web-dev-qa-db-fra.com

accès à HttpContext.Request dans le constructeur d'un contrôleur

Je suis ceci tutoriel ASP.NET MVC de Microsoft :

Mon code est légèrement différent, où j'essaie d'accéder à HttpContext.Request.IsAuthenticated dans le constructeur du contrôleur.

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

Le problème est que HttpContext est toujours nul.

Y a-t-il une solution à cela?

51
ozsenegal

Le contrôleur est instancié de manière significative avant le point où l'action Index est invoquée, et au moment de la construction, HttpContext n'est en effet pas disponible. Quel est le problème avec le référencer dans votre méthode de contrôleur Index?

9
spender

au lieu de mettre votre HttpContext.Request.IsAuthenticated au niveau Controller, vous devez le placer dans la classe Controller Base qui sera héritée dans tout votre contrôleur avec une méthode de remplacement de la méthode OnActionExecuting ().

Dans votre base de contrôleur, vous devriez avoir

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

et tout votre contrôleur devrait hériter de la classe BaseController

public class ApplicationController : BaseController

vous devriez maintenant obtenir le ViewData["IsAuthenticated"] dans votre page maître.

Éditer

Avec le lien que vous avez donné et relatif à ce que vous avez fait, votre ApplicationController est un contrôleur de page, pas un contrôleur de base. Dans l'exemple, ApplicationController est un contrôleur de base hérité par le HomeController mais ce que vous avez fait, c'est que vous placez la méthode Action dans votre contrôleur de base, qui est le ApplicationController votre méthode Action Index ne sera donc pas invoquée lorsque vous appelez une page (page Index) qui ne provient pas d'ApplicationController.

103
rob waminal

Je vous suggère d'utiliser:

 System.Web.HttpContext.Current.Request

Rappelez-vous juste System.Web.HttpContext.Current est threadstatic, mais si vous n'utilisez pas de thread supplémentaire, la solution fonctionne.

49
Ghini Antonio

La solution de ce problème consiste à créer une méthode de remplacement de Initialize en passant l'objet 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;
        }
    }
}
8
Ricardo Rodriguez