OnActionExecuted在Web API中被调用两次

时间:2013-11-26 14:22:55

标签: asp.net-mvc asp.net-web-api actionfilterattribute onactionexecuted

在我的控制器完成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 个答案:

答案 0 :(得分:18)

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

这将停止两次调用您的ActionFilter。还要检查它没有被注册两次。请查看此stackoverflow answer,以了解有关此内容的更多信息。

请注意,AttributeUsage属性是一次性使用的属性-不能多次应用于同一类,正如您在this的备注部分中所见。

答案 3 :(得分:0)

如果您在 Global.asax.cs 中注册了自定义过滤器,如下所示:

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

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