【问题标题】:Call from Web API to another Web API without waiting for results从 Web API 调用另一个 Web API 而不等待结果
【发布时间】:2015-05-28 13:16:41
【问题描述】:

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

我遇到的情况是,我真的不在乎调用是否成功,并且我不需要该查询的结果。

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

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

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

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

【问题讨论】:

    标签: c# asp.net-web-api


    【解决方案1】:

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

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

    我正在尝试理解做这样的事情的影响

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

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

    这意味着您的应用程序或接收应用程序中抛出的任何异常都不会被捕获(有一些方法可以解决这个问题)

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

    当您只想打一个电话时,您可能会打多个电话,然后就忘记了。

    1. 您的站点运行的 AppDomain 可能由于多种原因而关闭,并导致您的后台任务随之中断。如果发生在代码执行过程中,这可能会损坏数据。

    危险就在这里。如果您的 AppDomain 出现故障,它可能会损坏发送到其他 API 的数据,从而导致另一端出现奇怪的行为。

    【讨论】:

      【解决方案2】:

      我试图理解做类似的事情的含义 这。我读了一遍,这真的很危险

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

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

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

      在他的许多帖子中,Stephan Cleary 试图传达一个观点,即卸载工作而不用 ASP.NET 注册是危险的,并且可能会导致不良副作用,正如您所阅读的所有原因。这也是为什么有诸如AspNetBackgroundTasks 之类的库或为此使用Hangfire 的原因。

      您最应该担心的是与请求无关的线程可能会导致your entire process to terminate

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

      【讨论】:

        【解决方案3】:

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

        据我了解,危险在于即发即弃线程中的异常可能会导致整个 IIS 进程崩溃。

        请参阅这个出色的link

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-15
          • 1970-01-01
          • 1970-01-01
          • 2017-03-01
          • 1970-01-01
          相关资源
          最近更新 更多