更改ASP.NETMVC中过滤器的默认顺序

更改ASP.NETMVC中过滤器的默认顺序,.net,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,asp.net-mvc-5,.net,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,Asp.net Mvc 5,是否在自定义IAAuthenticationFilter之前强制执行自定义IActionFilter 我熟悉以下有关过滤器订购的文档: 但我想知道我是否能改变它。我实现了如下自定义IFilterProvider,但无法使我的授权筛选器(IAAuthorizationFilter)在UnitOfWork(IActionFilter)之后执行 公共类CustomFilterProvider:IFilterProvider { 公共IEnumerable GetFilters(ControllerC

是否在自定义IAAuthenticationFilter之前强制执行自定义IActionFilter

我熟悉以下有关过滤器订购的文档:

但我想知道我是否能改变它。我实现了如下自定义IFilterProvider,但无法使我的授权筛选器(IAAuthorizationFilter)在UnitOfWork(IActionFilter)之后执行

公共类CustomFilterProvider:IFilterProvider
{
公共IEnumerable GetFilters(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor)
{
返回新列表
{
新筛选器(新UnitOfWork(),FilterScope.Global,0),
新过滤器(新CustomAuthorization(),FilterScope.Global,30),
};
}
}

看起来,除非您想覆盖ControllerActionInvoker.InvokeAction方法并完全更改这些内容的默认MVC管道,否则您最好在过滤器类型中排序过滤器


我发现过滤器不好用。希望它们能够作为操作之上的装饰器来实现,这样我们就可以更轻松地包装它们的功能。

请参见链接文章中的“授权过滤器在任何其他过滤器之前运行”,这很有意义-如果您没有授权运行代码,为什么还要麻烦运行代码。但是我想你可以创建一个自定义的授权过滤器来完成你想做的事情want@StephenMuecke我希望UnitOfWork在之前发生,因为它负责打开db连接并维护其事务范围。我有需要查询数据库的授权过滤器,所以这项工作需要在授权之前完成。我确实意识到我可以将工作单元转移到其他地方。过滤器绝对是进行数据库活动最糟糕的地方。除此之外,这在表示层的管道中很深(数据访问应该远低于业务层),您对它们的创建或销毁几乎没有控制权,这对于您需要清理资源的地方来说非常糟糕。@ErikFunkenbusch您是说您反对在筛选器中包含一个工作单元,还是说授权筛选器永远不应该访问数据库?我倾向于将我的工作单元移出过滤器,但我的授权必须访问数据库。
public class CustomFilterProvider : IFilterProvider
{
    public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
        return new List<Filter>
        {
            new Filter(new UnitOfWork(), FilterScope.Global, 0),
            new Filter(new CustomAuthorization(), FilterScope.Global, 30),
        };
    }
}