有没有办法在我自己的网络API中对外部网络API进行Http
调用,而无需等待结果?
我遇到的情况是,我真的不在乎通话是否成功,而且我不需要该查询的结果。
我目前正在使用其中一种网络API方法执行此类操作:
var client = new HttpClient() { BaseAddress = someOtherApiAddress };
client.PostAsync("DoSomething", null);
我不能将这段代码放在using
语句中,因为在这种情况下调用没有通过。我也不想在任务上致电.Result()
,因为我不想等待查询完成。
我试图理解做这样的事情的含义。我看到all over这是really dangerous,但我不确定原因。例如,当我的初始查询结束时会发生什么。请IIS
处置线程和客户端对象,这会导致查询另一端出现问题吗?
答案 0 :(得分:1)
我试图理解做某事的含义 这个。我全身都知道这真的很危险
危险是相对的。如果你执行了一些你完全不关心的事情,那么如果你决定在你的应用程序执行期间回收你的应用程序,那么你根本就不在乎,如果你呢?您需要记住的是,在没有注册的情况下卸载工作也可能导致整个过程终止。
IIS会处理线程和客户端对象吗?
IIS 可以回收AppDomain,导致您的线程异常中止。 是否会这样做取决于许多因素,例如您在IIS中如何定义回收,以及您是否正在进行may cause a recycle的任何其他操作。
在很多帖子中,Stephan Cleary试图传达这样一个观点,即卸载工作而不用ASP.NET注册它是危险的,并且可能导致不良副作用,原因是你已经阅读过了。这就是为什么有AspNetBackgroundTasks
等库或使用Hangfire的原因。
你最担心的是一个与请求无关的帖子可能导致your entire process to terminate:
与请求无关的线程中的未处理异常将会发生 记下这个过程。即使您有处理程序设置,也会发生这种情况 通过Application_Error方法。
答案 1 :(得分:1)
是的,有几种方法可以解雇"任务"或者不需要确认的工作。我已经使用了Hangfire,它对我来说效果很好。
根据我的理解,危险是一个点不点火的线程中的异常可能会导致整个IIS进程崩溃。
请参阅此优秀link。
答案 2 :(得分:1)
有没有办法在我自己的Web API中触发对外部Web API的Http调用,而无需等待结果?
是。它被称为火和忘记。但是,您似乎已经发现了它。
我正在努力理解做这样的事情的含义
在上面链接的答案中的links之一中陈述了三种风险:
- 与请求无关的线程中的未处理异常将取消该过程。即使您通过Application_Error方法设置了处理程序,也会发生这种情况。
醇>
这意味着您的应用程序或接收应用程序中抛出的任何异常都不会被捕获(有方法可以通过它)
- 如果您在网络服务器场中运行您的网站,您最终可能会遇到应用程序的多个实例,这些实例都会同时尝试运行相同的任务。处理比第一项更具挑战性,但仍然不太难。一种典型的方法是使用所有服务器(例如数据库)共用的资源作为协调任务的同步机制。
醇>
当你只想拥有一个时,你可以进行多次点火和忘记呼叫。
- 您的网站运行的AppDomain可能由于多种原因而停止运行,并使用它来完成后台任务。如果数据在代码执行过程中发生,这可能会破坏数据。
醇>
这是危险。如果您的AppDomain发生故障,它可能会破坏发送到另一个API的数据,导致另一端出现奇怪的行为。