Asp.net-Mvc

屬性的 OnActionExecuted 方法是否總是執行?

  • July 5, 2016

我搜尋了高低,我似乎無法找到一個直接的答案。

如果我有自定義屬性/過濾器,是否會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

引用自:https://stackoverflow.com/questions/1650108