15

在我的控制器完成 OnActionExecuted 的操作后,我正在尝试做一些事情。但是,该方法被调用了两次。

我的过滤方法

public class TestFilter: ActionFilterAttribute
{
  public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {

       //do stuff here


    }
}

和我的控制器

[TestFilter]
  public class BaseController : ApiController
{
 public LoginResponseDTO Login(LoginRequestDTO loginRequestDTO)
    {

 //do login stuff
    }

}

当我尝试这个过滤器时,onActionExecuted 方法被调用两次,这导致我在方法中的操作被两次应用于响应。我已经搜索了一个原因,但找不到解决方案。

有任何想法吗?

4

4 回答 4

25

答案来自上面的@Martijn 评论:

 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
 public class TestFilter: ActionFilterAttribute

所有的功劳都归他所有。(注意:如果他决定添加评论作为答案,我将删除该帖子)

于 2015-09-26T12:35:32.510 回答
1

对我来说,问题是我正在调用 /myApi/action ,它正在重定向到 /myApi/action/ ,这导致 OnActionExecuted() 运行两次。

我过滤掉了 OnActionExecuted 中filterContext.Result 是 RedirectResult的位置,因为那时我对运行我的代码不感兴趣。HTTP 状态代码在两个调用中都显示为 200,因此按此过滤将不起作用。

于 2017-08-18T22:11:24.457 回答
1

如果你已经在 Global.asax.cs 中注册了自定义过滤器,像这样:

GlobalConfiguration.Configuration.Filters.Add(new TestFilterAttribute());

请撤销自定义控制器上方的属性。

于 2021-01-11T00:45:32.577 回答
0

您可以覆盖 ActionFilterAttribute 中的 AllowMultiple,如下所示:

public override bool AllowMultiple { get { return false; } }

public override void OnActionExecuting(HttpActionContext actionContext)
{
  //Your logic
}

这将阻止您的 ActionFilter 被调用两次。还要检查它是否没有注册两次。查看此stackoverflow 答案以了解更多信息。

请注意 AttributeUsage 属性是一次性属性——它不能多次应用于同一个类,您将在 this 的备注部分中找到

于 2019-07-25T12:46:37.673 回答