2016-06-23 4 views
0

Я унаследовал приложение, которое использует Application_PreRequestHandlerExecute для перенаправления на логин, если срок действия сессии истек.Overriding Application_PreRequestHandlerExecute

В настоящее время существует список жестко запрограммированных URL-адресов, которые не должны вызывать перенаправление. По сути, это ajax-методы, которые возвращают json, поэтому они обрабатываются отдельно в javascript.

Я хотел бы изменить механизм так, чтобы значение по умолчанию (в Application_PreRequestHandlerExecute) оставалось неизменным, но альтернативное поведение может контролироваться ActionFilters над соответствующими действиями (т. Е. Соответствующими жестко запрограммированному списку URL-адресов).

Как проверить наличие конкретного ActionFilter в Application_PreRequestHandlerExecute?

EDIT: Возможно, мне нужно заменить Application_PreRequestHandlerExecute на Глобальный фильтр действий?

ответ

0

Короткий ответ заключается в замене глобальным фильтром действий.

В этом filterContext есть все, что мне нужно.

EDIT: Это суть того, что я пошел:

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); 

    } 
}