动作过滤器属性和控制器继承之间的顺序



我有两个抽象api控制器,看起来很像这样:

[BaseActionFilter]
public abstract class ApiBaseController : ApiController
{
}
[StackActionFilter]
public abstract class StackApiBaseController : ApiBaseController 
{
}

现在我使用2个动作过滤器,覆盖OnActionExecuting方法并做一些业务逻辑。

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

当我使用从StackApiBaseController继承的控制器时,我有一个问题。

我的问题StackActionFilter取决于BaseActionFilter的结果,在我的情况下,在 BaseActionFilter运行之前运行 (我认为"父亲"首先运行)。

我有什么办法可以在这里订货吗?当我使用继承StackApiBaseController的控制器时,我希望BaseActionFilterStackActionFilter之前运行。

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

然后你可以通过放置底座的位置来控制顺序。onactionexecute调用StackApiActionFilterAttribute.

        public override void OnActionExecuting(HttpActionContext actionContext)
    {
        //HERE
        base.OnActionExecuting(actionContext);
        //OR HERE

这是不理想的,因为你需要把BaseactionFilterAttributeApiBaseController,因此失去控制的通用能力被强制任何控制器直接继承从ApiBaseController,但它确实提供了一个解决方案的问题,如所述

我相信如果你将BaseActionFilter添加到StackApiController中,它们将按照应用的顺序执行

最新更新