【问题标题】:Async Web Service Calls异步 Web 服务调用
【发布时间】:2011-09-03 02:13:40
【问题描述】:

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

我需要做的是:

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

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

【问题讨论】:

  • 如果服务在完成时触发一个事件,您可以订阅 Asyc 服务调用完成不是更好吗?您每 5 秒轮询一次是否有任何具体原因?
  • 不,它只是需要一些方法来确定它是否已经完成。完成后是否可以触发页面加载?
  • 一定要小心避免“使用真正过时的技术”,只是为了避免一些不新鲜的东西。有时,最简单、最好的工作工具是已经存在很长时间的工具。

标签: c# asp.net service


【解决方案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. 客户端网页处理 web 服务响应,该响应将包含结果数据或空集,它应继续在其中轮询。

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

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

【讨论】:

    【解决方案2】:

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

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

    Something 您可能需要注意这一点。并且 javascript 引擎在单个线程中执行代码。

    【讨论】:

    • 我需要网页来发出请求,然后“忘记”请求并继续它要做的任何其他事情。然后需要以某种方式通知请求已完成。我意识到同步调用可能是合适的,但我的任务是创建同步和异步请求。 (用于 jbo 面试测试)
    • 是的,正是“请求然后'忘记'请求并继续进行任何事情”。这是一个简单的 websrevice 将执行的正常行为,并在 google 中阅读“jquery ajax”。
    • 看起来我们需要一个 job-interview-test 标签,比如 homework 标签 :)
    • 假设我将请求放在我的 page_load 或按钮单击事件中。在我收到来自服务的响应之前,使用同步请求不会执行更多代码。我要做的是提交请求,然后在稍后通知它已经完成。
    • @hover 做过@AB Kolan 概述的任何事情吗?如果不是,我认为你可能没有足够的时间来掌握这一切,直到你的测试结束(我怀疑是几天)。快速帮助:forums.asp.net/t/1182061.aspx/1 祝你好运
    【解决方案3】:
    • 第 0 步:创建网络服务。
    • 第 1 步:创建 Web 应用项目(假设它是 ASP.NET)。
    • 第 2 步:将 Web 服务的 Web 引用添加到您的 Web 应用项目中。
    • 第 3 步:引用将为您创建一个代理,您可以使用该代理调用同步和异步调用。

    【讨论】:

    • 这一切都说得通,我已经完成了第 0-2 步,但我被困在第 3 步了。
    猜你喜欢
    • 2023-03-15
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    相关资源
    最近更新 更多