WebService和Polling

时间:2009-01-28 12:27:24

标签: c# .net web-services c#-2.0

我想实现一个包含一个方法的WebService,该方法的响应将延迟不到1秒到大约一个小时(这取决于数据是否已被缓存或需要获取)。

基本上我的问题是,如果您只能从客户端连接到WebService(无法通知),那么实现此方法的最佳方法是什么?

AFAIK这只能通过使用某种轮询来实现。但是民意调查很糟糕,所以我宁愿避免使用它。另一个极端可能是只要方法没有完成就让连接保持打开状态。但我想这最终可能会减慢网络服务器和网络的速度。我考虑将这两项技术结合起来。然后客户端将调用该方法,服务器将在至少10秒后返回,其中包含客户端需要再次轮询的消息或实际结果。

你有什么想法?

5 个答案:

答案 0 :(得分:3)

您可能想查看comet

答案 1 :(得分:2)

如果可能,我建议进行一种智能轮询:

  • 在第一次请求时,返回一个令牌来表示请求。这是在将来的请求中显示的内容,因此很容易检查该请求是否真的已完成。
  • 在将来的请求中,保持连接打开一段时间(例如,一分钟,可能在客户端上指定)并返回 结果结果“仍然没有结果;请在X处再试一次”,其中X是您完成回复时的最佳猜测。

优点:

  • 您允许客户端使用相对昂贵的“保持连接打开”模式(就连接而言),但允许响应在准备就绪后立即提供。确保你没有抓住每个连接的线程! (并且有一些时间限制......)
  • 说客户应该回来的时候,你可以实施退避政策 - 即使你不知道什么时候准备就绪,你也可以“退回”1,2,4,8,16,30 ,30,30,30 ......“分钟政策。 (您应该检查客户端是否忽略了这一点。)您不会因为长期未命中而浪费大量浪费,但您仍然可以快速获得快速结果。

答案 2 :(得分:1)

我认为对于可能需要一个小时来响应Web服务的事情并不是最好的使用机制。

为什么投票不好?当然,如果你调整轮询的频率,它就不会那么糟糕。民意调查之间的时间可能会增加一倍,最多约五分钟。

答案 3 :(得分:0)

我曾与之合作的某些网络服务在无法立即响应的情况下返回“请再次尝试”xml邮件。我意识到这只是对轮询技术的一种改进,但是如果你的服务器可以在请求时确定可能的延迟是什么,它可以告诉客户端然后忘记它,让客户端离开轮询间隔到期后再次询问。

答案 4 :(得分:0)

IIS和客户端存在超时,这将阻止您打开连接。 这也不实用,因为服务器上的资源/连接被阻止。

为什么您希望用户等待这么长时间运行的任务?让他们在某处查看操作的状态。