C# 动作筛选器属性和控制器继承之间的顺序

C# 动作筛选器属性和控制器继承之间的顺序,c#,asp.net-mvc,inheritance,asp.net-web-api,action-filter,C#,Asp.net Mvc,Inheritance,Asp.net Web Api,Action Filter,我有两个抽象api控制器,大致如下所示: [BaseActionFilter] public abstract class ApiBaseController : ApiController { } [StackActionFilter] public abstract class StackApiBaseController : ApiBaseController { } 现在我使用了两个动作过滤器,它们覆盖了OnActionExecuting方法并执行一些业务逻辑 现在,当我使用从Ap

我有两个抽象api控制器,大致如下所示:

[BaseActionFilter]
public abstract class ApiBaseController : ApiController
{
}

[StackActionFilter]
public abstract class StackApiBaseController : ApiBaseController 
{
}
现在我使用了两个动作过滤器,它们覆盖了
OnActionExecuting
方法并执行一些业务逻辑

现在,当我使用从
ApiBaseController
继承的控制器时,
BaseActionFilter
工作得很好

当我使用从
StackApiBaseController
继承的控制器时,我遇到了一个问题

我的问题是
StackActionFilter
取决于
BaseActionFilter
的结果,在我的例子中,在
BaseActionFilter
运行之前运行(我认为“父亲”先运行)


我能在这里点些东西吗?当我使用继承
StackApiBaseController

的控制器时,我希望
BaseActionFilter
StackActionFilter
之前运行,它们将按应用顺序执行。

一种方法是使StackActionFilterAttribute从BaseactionFilterAttribute继承,并仅将StackActionFilterAttribute应用于StackApiBaseController

然后,您可以通过在StackApiationFilterAttribute中放置base.OnActionExecuting调用的位置来控制顺序


这并不理想,因为您需要将BaseactionFilterAttribute从ApiBaseController中移除,从而失去对直接从ApiBaseController继承的任何控制器上强制执行的通用功能的控制,但它确实提供了上述问题的解决方案。

这些是自定义筛选器吗?如果是这样,您应该设置过滤器的
Order
属性来控制它们的执行顺序。我没有任何订单属性。是的,我知道这些是
actionfilteratAttribute
s。我想问的是,您是否通过继承
ActionFilterAttribute
(因此可以访问受保护的访问器)自己创建了这些,或者这些是内置类还是来自某个库。是的,它们是继承的,我在这两种情况下都重写了“OnActionExecuting”方法。好的,因此,在这两个属性类的构造函数中,根据需要它们执行的顺序,将protected
Order
属性设置为不同的值。我知道这会起作用,但在我使用继承“增益”时,复制过滤器似乎不对父类功能。您仍然获得基类筛选器,对吗?BaseActionFilter仍将被调用,只是调用的顺序与您喜欢的顺序不同。我理解您在这里试图实现的目标,但BaseActionFilter将在两个控制器上运行,并且这似乎不是正确的方法。。
        public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //HERE
        base.OnActionExecuting(actionContext);
        //OR HERE