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

C# 从Web API调用另一个Web API而不等待结果,c#,asp.net-web-api,C#,Asp.net Web Api,有没有一种方法可以在我自己的web API中触发对外部web API的Http调用,而不必等待结果 我的情况是,我真的不在乎调用是否成功,也不需要该查询的结果 我目前正在我的一个web API方法中执行类似的操作: var client = new HttpClient() { BaseAddress = someOtherApiAddress }; client.PostAsync("DoSomething", null); 我不能使用语句将这段代码放在语句中,因为在这种情况下调用不会通过。

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

我的情况是,我真的不在乎调用是否成功,也不需要该查询的结果

我目前正在我的一个web API方法中执行类似的操作:

var client = new HttpClient() { BaseAddress = someOtherApiAddress };
client.PostAsync("DoSomething", null);
我不能使用语句将这段代码放在
语句中,因为在这种情况下调用不会通过。我也不想对任务调用
.Result()
,因为我不想等待查询完成

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

我在试图理解做这样的事情的含义 这我通篇读到这真的很危险

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

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

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

斯蒂芬·克利里(Stephan Cleary)在他的许多博文中都试图传达这样一个观点,即不在ASP.NET上注册而卸载工作是危险的,并且可能会导致不良的副作用,原因与你所读到的一样。这也是为什么会有像或使用Hangfire这样的库

您最应该担心的是与请求无关的线程可能会导致:

与请求无关的线程中的未处理异常将被删除 记下这个过程。即使有处理程序设置,也会发生这种情况 通过应用程序错误方法


是的,有几种方法可以在不需要确认的情况下启动并忘记“任务”或工作。我用过,它对我很有效

据我所知,危险在于fire and forget线程中的异常可能会导致整个IIS进程崩溃

看到这个了吗

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

对。这叫“火与遗忘”。然而,你似乎已经发现了它

我正试图理解这样做的含义

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

  • 与请求无关的线程中的未处理异常将关闭进程。即使通过应用程序错误方法设置了处理程序,也会发生这种情况 这意味着您的应用程序或接收应用程序中抛出的任何异常都不会被捕获(有一些方法可以克服此问题)

  • 如果您在Web场中运行站点,您可能会得到多个应用程序实例,这些实例都试图同时运行同一任务。与第一项相比,处理起来更具挑战性,但仍然不太难。一种典型的方法是使用所有服务器(如数据库)共有的资源作为协调任务的同步机制
  • 当你只想打一个电话时,你可以打多个电话

  • 您的站点运行的AppDomain可能由于多种原因而停止运行,并随之停止您的后台任务。如果在代码执行过程中发生这种情况,可能会损坏数据。
  • 危险就在这里。如果您的AppDomain宕机,它可能会损坏发送到另一个API的数据,导致另一端出现异常行为