在撰写this answer时,有人问我是否对ActionFilterAttribute的行为有所保证。我无法自信地回答。
特别是,所有四种方法OnActionExecuted
,OnActionExecuting
,OnResultExecuted
&保证为通过该属性的所有请求调用OnResultExecuting
,或者是否存在一个或多个阶段可能不会触发的情况(例如异常,连接丢失等)?
答案 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()
有例外。