ActionFilterAttribute的所有阶段都保证被调用吗?

本文关键字:调用 ActionFilterAttribute | 更新日期: 2023-09-27 18:09:40

在写这个答案时,我被问到是否有关于ActionFilterAttribute行为的保证。我无法自信地回答。

特别是OnActionExecuted, OnActionExecuting, OnResultExecuted &OnResultExecuting保证被调用通过属性的所有请求,或者有情况(如异常,断开连接等),其中一个或多个阶段可能不会触发?

ActionFilterAttribute的所有阶段都保证被调用吗?

不,它们不能保证被调用。

考虑授权过滤器。如果授权失败,您希望运行任何操作过滤器吗?这可能是个很大的安全漏洞。我相信一个异常也会停止过滤器的管道,只有异常过滤器会从那个点开始执行。

给定以下过滤器:

public class ExampleFilterAttribute : FilterAttribute, IActionFilter
{
    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // this code is never reached...
    }
    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        throw new NotImplementedException();
    }
}

设置以下控制器动作:

[ExampleFilter]
public ActionResult Index()
{
    // this code is never reached...
    return View();
}

由于OnActionExecuting()有异常,Index()方法和OnActionExecuted()方法都没有到达。