是否保证调用ActionFilterAttribute的所有阶段?

时间:2014-06-20 18:52:06

标签: c# asp.net-mvc asp.net-mvc-5 actionfilterattribute

在撰写this answer时,有人问我是否对ActionFilterAttribute的行为有所保证。我无法自信地回答。

特别是,所有四种方法OnActionExecutedOnActionExecutingOnResultExecuted&保证为通过该属性的所有请求调用OnResultExecuting,或者是否存在一个或多个阶段可能不会触发的情况(例如异常,连接丢失等)?

1 个答案:

答案 0 :(得分:2)

不能保证不会被召唤。

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

给出以下过滤器:

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();
}

Index()方法或OnActionExecuted()都未到达,因为OnActionExecuting()有例外。