我用的是最新的web api.

我用3种不同的过滤器属性注释了some个控制器.

1 [Authorize]
2 [RessourceOwnerAttribute derived from AuthorizationFilterAttribute]
3 [InvalidModelStateAttribute derived from ActionFilterAttribute]

我不能确定过滤器是按照从上到下的顺序运行的.

我如何定义web api 2.1的执行顺序?

https://aspnetwebstack.codeplex.com/workitem/1065#

http://aspnet.uservoice.com/forums/147201-asp-net-web-api/suggestions/3346720-execution-order-of-mvc4-webapi-action-filters

我还得自己修吗??

推荐答案

这里需要注意的事项如下:

  1. Filters get executed in the following order for an action: Globally Defined Filters -> Controller-specific Filters -> Action-specific Filters.
  2. Authorization Filters -> Action Filters -> Exception Filters
  3. 现在你提到的问题与

    // Start clean by replacing with filter provider for global configuration.
    // For these globally added filters we need not do any ordering as filters are 
    // executed in the order they are added to the filter collection
    config.Services.Replace(typeof(IFilterProvider), new System.Web.Http.Filters.ConfigurationFilterProvider());
    
    // Custom action filter provider which does ordering
    config.Services.Add(typeof(IFilterProvider), new OrderedFilterProvider());
    

    public class OrderedFilterProvider : IFilterProvider
    {
        public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
        {
            // controller-specific
            IEnumerable<FilterInfo> controllerSpecificFilters = OrderFilters(actionDescriptor.ControllerDescriptor.GetFilters(), FilterScope.Controller);
    
            // action-specific
            IEnumerable<FilterInfo> actionSpecificFilters = OrderFilters(actionDescriptor.GetFilters(), FilterScope.Action);
    
            return controllerSpecificFilters.Concat(actionSpecificFilters);
        }
    
        private IEnumerable<FilterInfo> OrderFilters(IEnumerable<IFilter> filters, FilterScope scope)
        {
            return filters.OfType<IOrderedFilter>()
                            .OrderBy(filter => filter.Order)
                            .Select(instance => new FilterInfo(instance, scope));
        }
    }
    

    //NOTE: Here I am creating base attributes which you would need to inherit from.
    public interface IOrderedFilter : IFilter
    {
        int Order { get; set; }
    }
    
    public class ActionFilterWithOrderAttribute : ActionFilterAttribute, IOrderedFilter
    {
        public int Order { get; set; }
    }
    
    public class AuthorizationFilterWithOrderAttribute : AuthorizationFilterAttribute, IOrderedFilter
    {
        public int Order { get; set; }
    }
    
    public class ExceptionFilterWithOrderAttribute : ExceptionFilterAttribute, IOrderedFilter
    {
        public int Order { get; set; }
    }
    

Asp.net相关问答推荐

在 Web.Config 中模拟标签

如何在 Javascript 中获取 C# 枚举

使用进程外会话状态的 ASP.NET 应用程序中的 SQL Server 连接问题

asp.net dropdownlist - 在 db 值之前添加空行

ASP.NET GridView 第二个标题行跨越主标题行

为什么我在安装 IE8 后无法从 Visual Studio 2005 调试?

控制器 SessionStateBehavior 是只读的,我可以更新会话变量

Response.Redirect 使用 ~ 路径

将复选框的值传递给 asp.net mvc4 中的控制器操作

如何获取 ActionLink 的工具提示?

将数据表导出到 Excel 文件

oAuth ASP.NET 成员资格提供程序

如何针对异常需求自定义 ASP.NET Web API AuthorizeAttribute

如何将 LINQ 左外连接限制为一行

如何验证 WebClient 请求?

HtmlAgilityPack Select 的子 node 不符合预期

ASP.Net 错误:应用程序池的标识无效

ASP.NET MVC 和 httpRuntime executionTimeout

ASP.NET 核心,更改未经授权的默认重定向

如何在 ASP.NET 响应中传递大文件?