无需等待结果即可从Web API调用另一个Web API

问题描述 投票:5回答:3

有没有办法在我自己的Web API中触发Http调用外部Web API而无需等待结果?

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

我目前在我的一个Web API方法中做了类似的事情:

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

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

我试图理解做这样的事情的含义。我读all over这是really dangerous,但我不知道为什么。例如,当我的初始查询结束时会发生什么。 IIS会处理线程和客户端对象吗?这会导致查询另一端出现问题吗?

c# asp.net-web-api
3个回答
1
投票

有没有办法在我自己的Web API中发出Http调用外部Web API而无需等待结果?

是。它被称为火和忘记。但是,似乎你已经发现了它。

我试图理解做这样的事情的含义

在上面链接的答案中的一个links中陈述了三个风险:

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

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

  1. 如果您在Web场中运行您的站点,您最终可能会有多个应用程序实例同时尝试运行相同的任务。处理比第一项更具挑战性,但仍然不太难。一种典型的方法是使用所有服务器共用的资源(例如数据库)作为协调任务的同步机制。

当你只想拥有一个时,你可以有多个火灾和忘记呼叫。

  1. 您的网站运行的AppDomain可能由于多种原因而停止运行,并使用它来完成后台任务。如果数据在代码执行过程中发生,则可能会损坏数据。

这是危险。如果您的AppDomain发生故障,它可能会破坏发送到另一个API的数据,从而导致另一端的奇怪行为。


1
投票

我试图理解做这样的事情的含义。我全都读到这真的很危险

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

IIS会处置线程和客户端对象吗?

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

在他的帖子中,Stephan Cleary尝试传达这样一个观点,即卸载工作而不用ASP.NET注册它是危险的,并且可能导致不良副作用,原因是你已经阅读过了。这也是为什么有像AspNetBackgroundTasks这样的图书馆或使用Hangfire的原因。

你应该最担心的是一个与请求无关的线程会导致your entire process to terminate

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


1
投票

是的,有几种方法可以在不需要确认的情况下点击并忘记“任务”或工作。我使用过Hangfire,它对我来说效果很好。

根据我的理解,危险是一个点不点火的线程中的异常可能会导致整个IIS进程崩溃。

看到这个优秀的link

© www.soinside.com 2019 - 2024. All rights reserved.