从Web API调用到另一个Web API而不等待结果

本文关键字:Web API 等待 结果 调用 另一个 | 更新日期: 2023-09-27 17:50:58

是否有一种方法可以在我自己的web API中触发对外部web API的Http调用,而无需等待结果?

我的情况是,我真的不关心调用是否成功,我不需要查询的结果。

我目前正在我的一个web API方法中做这样的事情:

var client = new HttpClient() { BaseAddress = someOtherApiAddress };
client.PostAsync("DoSomething", null);

我不能把这段代码放在using语句中,因为在这种情况下调用不会通过。我也不想在任务上调用.Result(),因为我不想等待查询完成。

我在试着理解这样做的含义。我到处读到这很危险,但我不知道为什么。例如,当我的初始查询结束时会发生什么。IIS会处理线程和客户端对象吗?这会在查询的另一端引起问题吗?

从Web API调用到另一个Web API而不等待结果

是否有一种方法可以在我自己的web API中触发对外部web API的Http调用,而不必等待结果?

是的。这叫做火和遗忘。然而,你似乎已经发现了它。

我正在努力理解这样做的含义

在你上面链接的答案中的一个链接中,说明了三种风险:

  1. 与请求无关的线程中未处理的异常将使进程关闭。即使通过Application_Error方法设置了处理程序,也会发生这种情况。

这意味着在您的应用程序或在接收应用程序中抛出的任何异常都不会被捕获(有一些方法可以绕过这一点)

  • 如果你在Web Farm中运行你的站点,你可能会以你的应用程序的多个实例而告终,它们都试图在同一时间运行相同的任务。比第一个项目更有挑战性,但仍然不是太难。一种典型的方法是使用所有服务器共用的资源,例如数据库,作为协调任务的同步机制。
  • 当你只想要一个电话时,你可以有多个"立即通知即忘记"的电话。

  • 你的网站运行的AppDomain可能会因为一些原因而下降,并带走你的后台任务。如果它发生在代码执行的中间,可能会损坏数据。
  • 危险就在这里。如果你的AppDomain宕机,它可能会破坏发送到其他API的数据,导致另一端的奇怪行为。

    我在试着理解做某事的含义这一点。我到处都看到这很危险

    危险是相对的。如果你执行一些你根本不在乎完成与否的东西,那么你也不应该关心IIS是否会在执行时回收你的应用,对吧?您需要记住的是,在没有注册的情况下卸载工作也可能导致整个过程终止。

    IIS会释放线程和客户端对象吗?

    IIS 可以回收AppDomain,导致线程异常中止。是否会这样做取决于许多因素,例如IIS中如何定义回收,以及您是否正在执行可能导致回收的任何其他操作。

    在他的许多帖子中,Stephan Cleary试图传达这样一个观点,即卸载工作而不将其注册到ASP。NET是危险的,可能会导致不良的副作用,因为你已经读到的所有原因。这也是为什么有像AspNetBackgroundTasks这样的库或使用Hangfire的原因。

    你最应该担心的是一个与请求无关的线程可能会导致整个进程终止:

    与请求无关的线程中未处理的异常将记下这个过程。即使您设置了处理程序,也会发生这种情况

    是的,有几种方法可以在不需要确认的情况下解雇并忘记"任务"或一项工作。我用过Hangfire,它对我很有效。

    危险,据我所知,一个"即发即弃"线程中的异常可能会使你的整个IIS进程瘫痪。

    查看这个链接