全局ASP.NET Web API过滤器是否总是按顺序执行?

3

我添加了许多全局的ASP.NET Web API过滤器(其中config是我的System.Web.Http.HttpConfiguration):

config.Filters.Add(new SomeFilter());
config.Filters.Add(new AnotherFilter());
config.Filters.Add(new YetAnotherField());

这些过滤器是否总是按照上述顺序执行? 我在测试时从未遇到它们没有按顺序执行,但想确保一下,因为我们的日志中可能会出现一些异常情况,如果它们没有按顺序执行(也可能是其他原因)。 HttpFilterCollection文档没有明确说明它保留顺序(尽管Add方法文档说明它将一个项添加到集合的末尾)。

1
这看起来像是一个重复的问题,但我不太有信心去处理它...你可以看一下这个链接:https://dev59.com/vmEi5IYBdhLWcg3wHJAR - spender
这个链接也许会有帮助:http://www.strathweb.com/2012/06/control-the-execution-order-of-your-filters-in-asp-net-web-api/ - Yuval Itzchakov
我相信这两个链接都是针对使用反射应用的属性过滤器,因此顺序不能保证。在我的情况下,它是直接手动添加到 HttpFilterCollection 中的。 - Wilhelm Kleu
1个回答

3
基于WebApi和Linq源,筛选器的执行顺序如下:
  1. 身份验证筛选器
  2. 授权筛选器
  3. 动作筛选器,根据范围确定
    • 全局
    • 控制器
    • 操作
  4. 异常筛选器
相同类型和范围的筛选器将按照它们添加到FilterCollection时的顺序执行。
例如:
config.Filters.Add(new ActionFilterAttribute1());
config.Filters.Add(new AuthenticationFilter());
config.Filters.Add(new ActionFilterAttribute2());

执行顺序将为

  1. 身份验证过滤器
  2. ActionFilterAttribute1
  3. ActionFilterAttribute2

2
请注意,对于OnActionExecuting来说,上述顺序似乎是正确的。但是对于OnActionExecuted来说,顺序似乎是相反的。 - demoncodemonkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接