在我的控制器完成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方法被调用两次,这导致我在方法中的操作被应用两次到响应。我搜索了一个原因但找不到解决方案。
任何想法?
答案 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());
请撤销自定义控制器上方的属性。