【问题标题】:How to do async work as part of web service?如何将异步工作作为 Web 服务的一部分?
【发布时间】:2013-03-05 23:15:45
【问题描述】:

我正在编写 Web 服务 A 并调用 Web 服务 B。

一旦我验证了 A 的输入,我想返回一个成功代码并然后调用 B。

我正在考虑的方式:

  • 看看我是否可以生成一个在 A 返回后完成的工作线程。
  • 编写代理或服务来调用 B 并使用可靠的队列来传输经过验证的参数。

运行时上下文是由 ASP.NET Web 应用托管的 Service.svc。

我应该怎么做?

更新:我只想说答案都很有用。我决定标记我使用的那个。

【问题讨论】:

  • 您可以通过几种方式来实现,您的网络服务使用什么? WCF?肥皂?休息吗?
  • 这是一个托管在 MVC 网站中的 WCF Web 服务。

标签: c# web-services iis asynchronous


【解决方案1】:

一旦我验证了 A 的输入,我想返回一个成功代码,然后调用 B。

在这种情况下,您应该将工作放入持久队列(MSMQ、Azure Bus 等),然后才返回成功代码。另一个系统(不在 ASP.NET 中托管;即 Azure 辅助角色、Win32 服务等)应该从队列中检索工作并调用 B。

这是唯一可靠的方法。 Phil Haack 有一个good blog post 说明为什么在 ASP.NET 中同时执行这两个部分是一个坏主意;它归结为回收利用。有关回收触发器 herehere 的更多信息。

【讨论】:

  • 异步 Web 服务是否具有该博客文章中描述的相同风险?
  • 不正常。默认情况下,在所有异步操作完成之前,ASP.NET 不会发送响应。因此,可能有一段时间(当async I/O 正在进行时)没有线程处理请求,但这没关系,因为尚未发送响应。当您尝试在发送响应之后 进行工作时,问题就出现了; IIS 和 ASP.NET 根本不是为这种情况设计的。
【解决方案2】:

Code Project 上的此链接应为您提供创建稳定 Async Communication with Windows Communication Foundation 所需的所有信息。

一本对这种交流方式进行了大量处理的书:

  • WCF 一步一步
  • 多层框架中的 WCF

希望这会有所帮助。我会给你一些例子,但是关于 Code Project 的教程应该能提供你所需要的。

【讨论】:

  • 那篇文章看起来很不错.. 所以 Begin 调用的返回值将是我在问题中提到的成功代码,对吧?
【解决方案3】:

你的第二个想法很好。将异步部分发送到 Windows 服务。如果您需要可靠性,请使用消息队列来实现。在任何情况下,您都可以使用 WCF 将请求发送到其他服务。

【讨论】:

    【解决方案4】:

    这个问题并不是针对任何特定的服务接口。通常,您的决定取决于您为什么要异步调用某些东西:

    1. 如果您只是想让客户快速响应单个 长时间运行的方法调用,调用您的异步方法并立即 返回可用于稍后检查任务进度的令牌(任务 ID 等)。
    2. 如果您有几个长时间运行的方法要执行,并且您主要希望异步调用以通过并行性提高效率,请在开始时调用任何可以调用的方法,然后继续执行不依赖于先前方法的所有其他方法。等待完成返回结果或启动后续任务所需的任何任务。
    3. 在大多数情况下,我会让客户端在带有状态标记的同步和异步方法之间进行选择;如果他们想继续,他们可以稍后再回来查看,如果在继续之前获得结果很重要,那么这也是一个选择。

    随着每个后续框架版本 > 3.5,这些方法变得更加容易,我相信其他答案已经让您深入了解如何在 c# 中启动、继续和/或等待异步任务结果的细节。

    【讨论】:

    • 是的,这些答案很有用。我在你的 (1) 案例中 - 客户端是一个需要低延迟的实时系统,但是我的另一个要求是立即调用另一个 Web 服务验证输入后 - 因为我无法控制其他 Web 服务的延迟,所以我不想依赖它很低(实际上我知道空闲后第一次调用最多需要 30 秒)。
    • 是的,那你肯定是第一个场景。您想要启动任务,并返回一个可用于检查其状态的 ID。据推测,第二个(较慢的)Web 服务调用将只是更新在给定该 ID 的情况下仍然可以看到的内容;这是一个非常经典的设计用例,所以我不会在这里喋喋不休;我假设您有某种键/值缓存来存储任务状态。
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 2014-10-21
    • 2021-08-24
    • 2013-01-18
    • 2010-10-28
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多