MVC 4中的异步操作过滤器

For*_*tus 32 c# asp.net-mvc actionfilterattribute async-await

我有一个动作过滤器,当在某些特定条件下使用时,必须执行Web服务调用以确保当前状态有效.这最初似乎是异步/等待的理想候选者,但我遇到了一个问题:

假设请求:/ Test/FilteredAction

  • MyCustomActionFilter开始执行
    • 达到了第一个"等待"声明
  • TestController.FilteredAction开始执行
  • MyCustomActionFilter继续执行

传统上我希望动作过滤器在控制器动作开始执行之前恢复执行然后完成,但这不会发生.

现在我假设这是因为我正在使用:

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

所以我认为我的问题是:MVC 4中是否有一个异步感知的动作过滤器类,或者我应该阻止这里的调用?

Ste*_*ary 40

MVC没有async兼容的动作过滤器(但WebAPI确实有一个).

目前,我建议您使用阻止呼叫OnActionExecuting.希望MVC将来会有更好的故事.

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

  • 这里的答案中的"在这里投票"链接被打破了 - 是否有最新消息支持这一点?如果仍然有投票的地方(或GitHub问题+1或其他什么),我会抛弃它.我用谷歌搜索了一下,但无法想出任何东西. (3认同)
  • +1 @DannyChen,调用服务以验证某些内容的过滤器是您希望异步支持过滤器的原因的确切示例.问题不在于同步过滤器不起作用,而是异步过滤器可以更好地工作. (2认同)
  • 用于MVC的@RobHruska`async`过滤器将适用于ASP.NET vNext.AFAIK他们没有计划将它添加到MVC的当前分支. (2认同)