【问题标题】:Does the OnActionExecuted method of an attribute always execute?属性的 OnActionExecuted 方法是否始终执行?
【发布时间】:2010-12-11 15:05:59
【问题描述】:

我从高处和低处搜索过,但似乎找不到一个直接的答案。

如果我有一个自定义属性/过滤器,OnActionExecuted 方法是否总是被调用?即使抛出异常?

【问题讨论】:

    标签: asp.net-mvc attributes


    【解决方案1】:

    至少对于 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
    

    【讨论】:

    • 感谢您为 MVC 5 更新此内容!
    • 那么,MVC
    • 我可以确认 MVC 4 也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2011-01-26
    • 2012-02-20
    • 2011-07-17
    • 1970-01-01
    • 2011-08-24
    • 2011-06-26
    相关资源
    最近更新 更多