17

AuthorizeAttribute을 구현하는 두 클래스를 만들었습니다.액션 필터 실행 순서

하나는 전 세계적으로 사용되며, 내가 Global.asax.cs에 설정 :

filters.Add(new FirstAuthorizeAttribute() { Order = 0 }); 

다른 하나는 SecondAuthorizeAttribute이라고하며 어떤 행동 방식 만 사용하고, 나는에 속성으로 사용 내가 원하는 방법.

[HttpGet] 
    [SecondAuthorize] 
    public ActionResult LogOut() 
    { 
     FormsAuthentication.SignOut(); 
     Session.Clear(); 
     Session.Abandon(); 
     return Redirect(Url.Content("~/")); 
    } 

문제는 SecondAuthorizeAttribute 항상 FirstAuthorizeAttribute 전에 실행한다는 것입니다, 내가 먼저 실행이 하나 필요합니다. 명령이 도움이되지 않습니다. 어떻게 할 수 있습니까?

답변

3

주문 global.asax.cs 파일에서 작동하지 않습니다. 요구 사항이 주문이라면 컨트롤러 또는 동작 방법으로 이동하여주십시오. 전 -

[secondAttribute (순서 = 1)] [firstAttribute (순서 = 2)]

HomeController : 컨트롤러

또는

공개 ActionResult 지수()

15

@ HectorCorrea의 대답은 현재 죽었습니다. 현재 Google 캐시에서 가져 와서 요약 한 내용은 다음과 같습니다 (

).

필터가이 순서대로 실행 :

  • 권한 부여
  • 액션 필터
  • 응답/결과 필터
  • 예외 필터
  • 각 필터 내에서

필터, 당신은 주문 속성을 지정할 수 있습니다 . 모든 필터는 추상 클래스 FilterAttribute에서 파생되며이 클래스에는 Order 속성이 있습니다. 이 속성은 필터가 특정 Order에서 실행되는지 확인합니다.

예 :

[AuthorizationFilterA(Order=2)] 
[AuthorizationFilterB(Order=1)] 
public ActionResult Index() 
{   
    return View(); 
} 

기본적으로,이 FilterScope도 그리고이 가장 낮은 범위를 가진 필터 순서가 동일한 경우 먼저 실행 (또는 지정되지 않음) :

namespace System.Web.Mvc { 
    public enum FilterScope { 
     First = 0, 
     Global = 10, 
     Controller = 20, 
     Action = 30, 
     Last = 100, 
    } 
} 

만약 어떤 order가 지정되면 order 값은 -1 (처음, 마지막이 아님)입니다.자체 필터가 될 수 있으며, 주문 Int32.MinValue

+2

예외 필터는 역순으로 실행된다는 점에 유의하십시오. 따라서 가장 높은 범위의 필터가 먼저 실행됩니다 – levelnis