异步Web服务调用

时间:2011-05-27 02:54:20

标签: c# asp.net service

我正在寻找创建一个使用异步Web服务调用的Web服务和随附的Web应用程序。我已经看到很多关于如何进行异步调用的建议,但似乎没有一个适合我正在尝试做的事情或正在使用一个非常过时的技术。我正在尝试在ASP.net 3.5(VS2008)中执行此操作

我需要做的是:

  1. 网页需要向服务提交请求
  2. 然后页面需要每隔5秒左右轮询一次服务以查看任务是否已完成
  3. 完成后,需要从服务中检索请求。
  4. 有人可以给我一些建议或指出我正确的方向吗?

3 个答案:

答案 0 :(得分:1)

我通常处理异步服务器端处理的方式是:

  1. 让网页针对Web服务发起请求,并让服务向长时间运行的事务返回一个ID。在我的例子中,我在客户端网页上使用了Ajax和jQuery,以及以JSON格式返回数据的web服务。 ASP.NET MVC特别适合这种情况,但您可以使用ASP.NET返回JSON字符串以响应GET,或者根本不使用JSON。

  2. 让服务器在数据库中创建记录,该记录还存储要处理的关联数据。此事务的ID将返回到客户端网页。然后,该服务通过消息队列向第三个服务发送消息。就我而言,该服务是托管在Windows服务中的WCF服务,其中MSMQ作为中介。应该注意的是,最好不要在ASP.NET中执行实际的任务处理,因为它不适用于长时间运行的请求。在高需求系统中,您可以耗尽可用线程。

  3. 第三个服务通过从数据库中读取和处理必要的数据来接收并响应排队的消息。它最终标志着数据库记录“完整”。

  4. 客户端网页轮询传递交易记录ID的Web服务。 Web服务根据此ID查询数据库,以确定记录是否标记为完成。如果完成,它将查询结果数据集并返回它。否则返回一个空集。

  5. 客户端网页处理webservice响应,该响应将包含结果数据或空集,应在其中继续轮询。

  6. 这只是一个例子,你可能会发现你可以使用快捷方式,避免在第三个服务中进行处理,只使用ASP.NET线程。但这表明了它自己的问题,即如果原始请求完成,您将如何获得另一个请求(轮询请求)。对此的解决方法是在静态变量中使用线程安全集合,该变量将保存事务ID /结果对。但是对于这种努力,使用数据库确实更好。

    编辑:我现在看到它似乎是一个示范而不是一个生产系统。对于“真实世界”的情况,我仍然支持我的上述大纲,但对于演示而言,“hackish”解决方案就足够了。

答案 1 :(得分:0)

哪部分需要做异步?据我所知,你的行为是同步的: 1) - > 2) - > 3)

一个简单的Web服务可以做,IIS(与任何Web服务器一样)支持多个请求处理异步,因此您没有问题。

您可能需要注意的

Something。而且javascript引擎也在一个线程中执行代码。

答案 2 :(得分:0)

  • 第0步:创建网络服务。
  • 第1步:创建网络应用程序项目(假设它是ASP.NET)。
  • 第2步:将网络服务的网络引用添加到您的网络应用项目中。
  • 第3步:引用将为您创建一个代理,您可以使用该代理调用同步和异步调用。