【发布时间】: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