2016-06-23 1 views
0

J'ai hérité d'une application qui utilise Application_PreRequestHandlerExecute pour rediriger la connexion si la session a expiré.Substitution de Application_PreRequestHandlerExecute

Actuellement, il existe une liste d'URL codées en dur qui ne doivent pas appeler une redirection. Essentiellement, ce sont des méthodes ajax qui renvoient json, donc elles sont traitées séparément en javascript. Je voudrais changer le mécanisme afin que le défaut (dans Application_PreRequestHandlerExecute) reste le même mais un comportement alternatif peut être contrôlé par ActionFilters sur les actions appropriées (c'est-à-dire celles correspondant à la liste d'URL codée en dur). Comment puis-je vérifier la présence de l'ActionFilter particulier dans Application_PreRequestHandlerExecute?

EDIT: Peut-être que j'ai besoin de remplacer Application_PreRequestHandlerExecute par un filtre d'action global?

Répondre

0

La réponse courte est de remplacer par un filtre d'action global.

Dans ce, filterContext a tout ce dont j'ai besoin.

EDIT: Voici l'essentiel de ce que je suis allé pour:

public enum SessionExpiredBehaviour 
{ 
    Redirect, 
    Ignore, 
    JSON 
} 


[AttributeUsage(AttributeTargets.Method)] 
public class SessionExpiredFilterAttribute : ActionFilterAttribute 
{ 
    public SessionExpiredBehaviour Behaviour { get; set; } = SessionExpiredBehaviour.Redirect; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 

     if (HttpContext.Current.Session["User"] == null) 
     { 
      switch (this.Behaviour) 
      { 

       case SessionExpiredBehaviour.Redirect: 
        filterContext.Result = 
         new RedirectToRouteResult(new RouteValueDictionary 
         { 
          { "action", "RedirectToLogin" }, 
          { "controller", "Account" } 
         }); 
        break; 

       case SessionExpiredBehaviour.JSON: 
        //TODO 
        break; 
      } 

     } 
     base.OnActionExecuting(filterContext); 

    } 
}