【问题标题】:Change default order of Filters within ASP.Net MVC在 ASP.Net MVC 中更改过滤器的默认顺序
【发布时间】:2014-11-26 22:55:25
【问题描述】:

是否有强制自定义 IActionFilter 在自定义 IAuthenticationFilter 之前执行?

我熟悉以下有关过滤器排序的文档:

http://msdn.microsoft.com/en-us/library/gg416513%28v=vs.98%29.aspx

但我想知道我是否可以改变它。我已经实现了如下所示的自定义 IFilterProvider,但无法在 UnitOfWork (IActionFilter) 之后执行我的授权过滤器 (IAuthorizationFilter)。

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),
        };
    }
}

【问题讨论】:

  • 链接文章指出“授权过滤器在任何其他过滤器之前运行”,这是有道理的 - 如果您没有获得授权,您为什么还要费心运行代码。但我想你可以创建一个自定义的授权过滤器来做你想做的事
  • @StephenMuecke 我希望 UnitOfWork 在之前发生,因为它负责打开数据库连接并维护其事务范围。我有需要查询数据库的授权过滤器,因此需要在授权之前完成这项工作。我确实意识到我可以将工作单元移到其他地方。
  • 过滤器是进行数据库活动的绝对最糟糕的地方。除了这在您的表示层的管道中很深(数据访问应该远低于您的业务层),您几乎无法控制它们何时创建或销毁,这对于您需要清理的东西来说是可怕的增加资源。
  • @ErikFunkenbusch 您是说您反对在过滤器中使用工作单元,还是说授权过滤器不应该访问数据库?我倾向于将我的工作单元移到过滤器之外,但我的授权必须访问数据库。

标签: .net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-5


【解决方案1】:

看起来你能做的最好的事情就是在过滤器类型中排序过滤器,除非你想重写 ControllerActionInvoker.InvokeAction 方法并完全改变这些东西的默认 MVC 管道。

我发现过滤器使用起来不愉快。希望它们被实现为操作之上的装饰器,以便我们可以更轻松地围绕它们包装功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    相关资源
    最近更新 更多