【问题标题】:asynchronous way to call webapi service调用web api服务的异步方式
【发布时间】:2026-01-14 02:20:02
【问题描述】:

我们有一个要求,我们需要从 MVC Web 应用程序调用 webapi service (via REST)

调用需要以asynchronous 的方式进行,并且应该是触发后忘记调用。希望您对这种情况下的最佳方法提出意见。

  1. 在任务并行库 (TPL) 中使用任务

  2. 使用 MVC 异步控制器。

请提供您对任何其他方法的想法以及参考资料。

【问题讨论】:

标签: .net asp.net-mvc asynchronous asp.net-web-api task-parallel-library


【解决方案1】:

首先,我会推荐使用 OWIN Katana (https://katanaproject.codeplex.com/) 作为 REST API Web 服务器。它原生支持引擎中的任务而不是线程。

关于异步 Web 方法,我建议使用 async/await。但仅在您在一种 Web 方法中发出多个可等待请求(第三方 Web 服务或对数据库的请求)的情况下使用它们。

【讨论】:

    【解决方案2】:

    应该是火了就忘了叫

    你确定吗? 99% 的情况下,ASP.NET 上的即发即弃是一个错误。明确地说,即发即弃意味着:

    1. 您不能通知调用者错误;和
    2. webapi 服务调用可能会中止。

    此外,“即发即弃”几乎永远不会得到任何东西。您为什么不直接从客户端而不是从您的 MVC 层中一劳永逸?

    但如果你真的坚持 webapi 调用必须是即发即弃,那么你可以follow one of the techniques on my blogHostingEnvironment.QueueBackgroundWorkItem

    【讨论】:

    • 在那里做过。如果您调用“异步”方法并且您不等待它,它可能不会一直执行。在您的开发人员机器上,它可能运行得很好(比如 99% 的时间),但在压力很大的服务器上,它可能不会运行超过 25% 的时间。
    • 仔细阅读斯蒂芬的博客,了解利弊。我们很难学到这一点。斯蒂芬的背景非常适合我们的案例,并且创造了奇迹。我认为你应该接受这个答案。