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

时间:2013-03-05 23:15:46

标签: c# web-services iis asynchronous

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

验证输入到A后,我想返回成功代码,然后调用B。

我正在考虑的方式:

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

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

我该怎么做?

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

4 个答案:

答案 0 :(得分:2)

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

一本有很多处理这种沟通方式的书:

  • WCF Step by Step
  • 多层框架中的WCF

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

答案 1 :(得分:2)

  

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

问题并非特定于任何特定服务接口。通常,您的决定取决于您想要异步调用某些内容的原因:

  1. 如果您只是想让客户快速回复一个人 长时间运行的方法调用,立即调用您的异步方法 返回一个令牌(任务ID等),可用于稍后检查任务的进度。
  2. 如果您有多个长时间运行的方法要执行,并且您主要想要异步调用以通过并行性来提高效率,那么请在一开始就调用任何内容。继续其他所有不依赖于以前方法的东西。等待返回结果完成所需的任何任务,或等待后续任务开始。
  3. 在大多数情况下,我会让客户端在具有状态令牌的同步和异步方法之间进行选择;如果他们想要继续,他们可以稍后再查看,如果在继续之前获得该结果很重要,那么这也是一个选择。
  4. 对于每个后续框架发布,这些方法变得更容易> 3.5,我相信其他答案已经让你很好地了解了如何在c#中启动,继续和/或等待异步任务结果的具体细节。