33

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

假设请求:/Test/FilteredAction

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

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

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

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

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

4

3 回答 3

42

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

目前,我建议您在OnActionExecuting. 希望 MVC 将来会有更好的故事。

更新:您可以在此处投票支持 MVC 团队添加async过滤器。

于 2012-09-18T18:22:30.853 回答
1

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

ASP.NET MVC 过滤器依赖于被排序的概念,一个过滤器被保证(如果指定的话。参见接口上的Order属性)如果指定的话以一定的顺序执行。IMvcFilter

鉴于此,必须解决的问题是:

  • 对于现有的非异步过滤器(至少没有以这种方式实现,因为没有其他方法),它们是自己完成任务还是继续前一个任务?这是一个需要回答的重要问题,因为您必须权衡不在另一个线程上继续下一个过滤器与在其他请求可以使用它时保持该线程的好处。

  • 对于指定了相同顺序的过滤器,它们是并行执行还是一个接一个地执行?使方法异步打开了这种可能性(即使它以前可以使用非异步签名完成)并且它绝对是一种架构更改,可能会对性能和预期结果产生影响。这里的答案不是那么简单,必须基于测试和向后兼容性。

于 2012-09-29T14:09:48.507 回答
0

你不能有异步过滤器,但你可以有异步事件处理程序

异步事件处理程序可以完成繁重的异步工作,写入HttpApplication.HttpContext.Items,然后您的同步过滤器可以对结果进行后处理或验证。

您可以在 Global.asax.cs 中注册事件处理程序,或者创建并注册一个 HTTP 模块

(所有过滤器都在 PreRequest 和 PostRequest 事件之间执行。)

于 2020-06-30T05:53:43.443 回答