2009-10-30 4 views

답변

3

적어도 MVC 5에서 @ tvanfosson의 대답은 더 이상 정확하지 않습니다. 이것은 이전 버전에도 적용될 수 있습니다.

OnActionExecuted은 항상 호출되며 filterContext.Exception을 통해 발생한 예외에 대한 액세스 권한이 있습니다. 동작에서 제외

테스트 케이스 :

public class HomeController 
    : Controller 
{ 
    public ActionResult Index() 
    { 
     throw new Exception("Index"); 
    } 
} 

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Foo()); 
     filters.Add(new Bar()); 
    } 
} 

public class Foo 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

public class Bar 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

출력 : 필터에서 제외

Bar.OnActionExecuting 
Foo.OnActionExecuting 
Exception thrown: 'System.Exception' in WebApplication1.dll 
Foo.OnActionExecuted 
Has exception: True 
Bar.OnActionExecuted 
Has exception: True 

테스트 케이스

public class HomeController 
    : Controller 
{ 
    public ActionResult Index() 
    { 
     return new HttpStatusCodeResult(200); 
    } 
} 

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new Foo()); 
     filters.Add(new Bar()); 
    } 
} 

public class Foo 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Foo)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     throw new Exception("Foo"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

public class Bar 
    : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuting)}"); 
     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     Debug.WriteLine($"{nameof(Bar)}.{nameof(OnActionExecuted)}"); 
     Debug.WriteLine($"Has exception: {filterContext.Exception != null}"); 
     base.OnActionExecuted(filterContext); 
    } 
} 

출력 :

Bar.OnActionExecuting 
Foo.OnActionExecuting 
Foo.OnActionExecuted 
Has exception: False 
Exception thrown: 'System.Exception' in WebApplication1.dll 
Bar.OnActionExecuted 
Has exception: True 
+0

MVC 5를 업데이트 해 주셔서 감사합니다! – Patricia

관련 문제