在MVC 4异步行为过滤(Async action filter in MVC 4)

2019-06-18 04:57发布

我有一个动作过滤器,在某些特定条件下使用时,必须执行Web服务调用,以确保当前的状态是有效的。 这最初似乎像异步/ AWAIT的理想人选,但我已经遇到了障碍:

假设一个请求:/测试/ FilteredAction

  • MyCustomActionFilter开始执行
    • 第一个“等待”达到声明
  • TestController.FilteredAction开始执行
  • MyCustomActionFilter恢复执行

传统上我希望动作过滤器能够恢复执行,然后完成控制操作开始执行之前,但这并没有发生。

现在,我想这是因为我使用:

public class MyCustomActionFilter : ActionFilterAttribute 
{
    public override **async** void OnActionExecuting(FilterContext context) 
    {
        var foo = await WebServiceCall();
    }
}

所以我想我的问题是:有没有内置MVC 4异步感知行动过滤器类,或者我应该只是在这里呼吁阻止?

Answer 1:

MVC没有一个async兼容的行为过滤器(但的WebAPI确实有一个 )。

现在,我建议你使用阻断调用OnActionExecuting 。 希望MVC将在未来的美好故事。

更新:您可以在这里投票的MVC团队添加async过滤器。



Answer 2:

没有,是MVC没有异步过滤器,但它可行的。

ASP.NET MVC过滤器依靠被订购的概念,一个过滤器是保证(如果指定,见的Order财产上IMvcFilter接口 )如果指定的执行在一定的秩序。

有鉴于此要解决的问题是:

  • 对于现有的不属于异步过滤器(至少没有实现 ,那是因为没有其他的方式),而他们得到自己的任务或继续关闭前一个? 这是回答一个重要的问题,因为你必须权衡不继续在另一个线程的下一个过滤器与持有到该线​​程,而其他请求都可以使用它的好处。

  • 对于有指定的相同顺序过滤器,请他们并行执行或一前一后? 制作方法异步打开这种可能性起来更(尽管它可能之前已经与非异步签名完成)和其绝对可能会对性能产生影响,以及预期结果,结构的变化。 这里的答案并非如此简单,就必须根据测试和向后兼容性。



文章来源: Async action filter in MVC 4