在MVC 5中的动作过滤器中调用异步方法

本文关键字:过滤器 调用 异步方法 MVC | 更新日期: 2023-09-27 18:17:32

我正在编写一个动作过滤器(从ActionFilterAttribute继承),它使用HttpClientOnResultExecuted方法中将数据POST到外部服务器。HttpClient有一个方法PostAsync,它返回一个可等待的Task<HttpResponseMessage>

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    using (var client = new HttpClient())
    {
        var task = client.PostAsync(GetUri(), GetContent());
        var result = task.Result; // blocking
    }
}

MVC 4中Async动作过滤器的可接受答案说在MVC 4中是不可能的。

这在MVC 5中仍然是正确的,如果是这样的话,调用这个异步方法而不阻塞线程的最佳方式是什么?

在MVC 5中的动作过滤器中调用异步方法

是的,它仍然是正确的。Web API 2支持异步动作过滤器,但MVC 5仍然不支持。不久前,我个人对此感到沮丧。目前,您要么需要在动作过滤器中以同步方式运行您的异步方法,要么在每个需要它的动作中重复您在动作过滤器中拥有的异步代码,然后您可以以异步方式运行。

有人在这里"反向移植"了它

https://github.com/jdaigle/Hydrogen.Extensions.Mvc5

我还没有尝试过,不能推荐它,但如果你正在过渡到。net Core,它可能值得考虑。幸运的是,我成功地从我的扩展中删除了所有异步代码-这次