繁体   English   中英

异步 Web 服务调用

[英]Async Web Service Calls

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

我需要做的是:

  1. 网页需要向服务提交请求
  2. 然后页面需要每 5 秒左右轮询一次服务以查看任务是否已完成
  3. 完成后,需要从服务中检索请求。

有人可以给我一些建议或指出正确的方向吗?

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

  1. 让网页向 Web 服务发起请求,并让服务向长期运行的事务返回一个 ID。 就我而言,我在客户端网页上使用了 Ajax 和 jQuery 以及一个以 JSON 格式返回数据的 Web 服务。 ASP.NET MVC is particularly well suited for this, but you can use ASP.NET to return JSON string in response to a GET, or not use JSON at all.

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

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

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

  5. 客户端网页处理 web 服务响应,该响应将包含结果数据或空集,它应该继续轮询。

这只是一个例子,你可能会发现你可以走捷径,避免在第三个服务中进行处理,只使用 ASP.NET 线程。 但这提出了它自己的问题,即如何让另一个请求(轮询请求)知道原始请求是否完成。 hackish 的解决方案是在 static 变量中使用线程安全集合,该变量将保存事务 ID/结果对。 但是对于这项工作,使用数据库确实更好。

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

哪一部分需要做异步? 据我所知,您的操作是同步的:1) -> 2) -> 3)

一个简单的 web 服务就可以了,IIS(与任何 web 服务器一样)支持异步处理多个请求,所以你没有问题。

您可能需要注意的事情 javascript 引擎也在单线程中执行代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM