如何将异步工作作为web服务的一部分



我正在编写web服务A并调用web服务b。

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

我正在考虑的方法:

  • 看看我是否可以生成一个在a返回后完成的工作线程。
  • 编码一个座席或服务到呼叫B,并使用可靠队列传递验证后的参数。

运行时上下文是一个服务。由ASP托管的svc。. NET web应用程序。

我该怎么做?

Update:我只想说答案都是有用的。我决定标记我用过的那个

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

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

这是唯一可靠的方法。Phil Haack写了一篇很好的博文,解释了为什么在ASP.NET中同时做这两部分是一个坏主意;归根结底是回收利用。

Code Project上的这个链接应该会给你创建一个与Windows Communication Foundation稳定的异步通信所需的所有信息。

一本关于这种交流方式的书:

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

希望这有帮助。我会给你一些例子,但是代码项目的教程应该提供你所需要的。

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

这个问题实际上并不特定于任何特定的服务接口。通常,您的决定取决于您为什么要异步调用某些内容:

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

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

最新更新