Asp.net-Mvc
屬性的 OnActionExecuted 方法是否總是執行?
我搜尋了高低,我似乎無法找到一個直接的答案。
如果我有自定義屬性/過濾器,是否會
OnActionExecuted始終呼叫該方法?即使拋出異常?
至少對於 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