【问题标题】:Is it possible to implement Async Webservice call in .Net not only by one connection?是否可以通过一个连接在.Net中实现异步Web服务调用?
【发布时间】:2012-07-10 07:57:11
【问题描述】:

我有一个 .net 网络服务。它有一个方法可以完成一个需要 60 秒的任务,然后将字符串结果返回给客户端。

在某些网络特别是低带宽中,我在 40 秒内收到超时错误,然后 webservice 方法在 60 秒内完成其任务。

现在我想实现 web 服务异步调用以支持低带宽网络。

在异步webservice调用中,一种方法是使用一个线程来运行webservice方法并将webservice结果返回给主线程,如下图所示。

但我的问题不会在这种方法中得到解决,因为该线程使用一个连接。

我需要另一种方法。我的客户端调用 webservice 方法和方法中的一个线程开始其操作,当任务完成时,1) webservice 发送一条消息,表明您的响应已准备好,或者,2) 客户端检查 webservice 是否响应已准备好(我认为是轮询机制) 如下图。

如何在 .net 中实现第二种方法?有可能吗?

谢谢。

【问题讨论】:

  • webservice有做数据库相关的操作吗?可能是使用MS-Sql 并且客户端可以直接访问它?
  • 是的,它是一个存储过程。
  • 我认为 wsDualHttpBinding 不是一个选项,因为客户端没有公共 URI。

标签: c# .net web-services asynchronous long-polling


【解决方案1】:

在您的数据库上创建一个表来存储进程的状态。

UniqClientId, ProcessId, StartTime, EndTime and any other state if required.
  1. 客户端通过传递其唯一 ID 向服务器发送请求。
  2. 服务器将进程记录在上表并启动进程。
  3. 客户端会立即联系服务器(2-3 秒或 15-20 秒,具体取决于您的应用程序)以检查流程是否完成。
  4. 如果客户端收到进程已完成的响应,则它会请求服务器发送响应。

在这两者之间,服务器执行以下工作。

  1. 进程完成后,将 EndTime 存储在上表中。
  2. 提供通过检查上表发送进程状态的方法。
  3. 提供发送响应的方法。

我不确定你的服务到底在做什么,但是如果你的进程的操作只是修改数据库上的某个表,那么实现起来并不难。

【讨论】:

  • 谢谢,我使用了一个静态类来保存请求状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多