ActionFilterAttribute的所有阶段都保证被调用吗?
本文关键字:调用 ActionFilterAttribute | 更新日期: 2023-09-27 18:09:40
在写这个答案时,我被问到是否有关于ActionFilterAttribute行为的保证。我无法自信地回答。
特别是OnActionExecuted
, OnActionExecuting
, OnResultExecuted
&OnResultExecuting
保证被调用通过属性的所有请求,或者有情况(如异常,断开连接等),其中一个或多个阶段可能不会触发?
不,它们不能保证被调用。
考虑授权过滤器。如果授权失败,您希望运行任何操作过滤器吗?这可能是个很大的安全漏洞。我相信一个异常也会停止过滤器的管道,只有异常过滤器会从那个点开始执行。
给定以下过滤器:
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()
方法都没有到达。