2009-01-28 146 views
3

我想实现一个WebService,其中包含一个方法,其答复将被延迟少于1秒到大约一个小时(取决于数据是否已被缓存或需要取回)。WebService和轮询

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

AFAIK这将只能通过使用某种投票。但是轮询很糟糕,所以我宁愿避免使用它。另一个极端可能是只要方法没有完成就让连接保持打开状态。但我想这可能会放慢网络服务器和网络。我想将这两种技术结合起来。然后,客户端会调用该方法,服务器将在至少10秒后返回客户端需要重新轮询的消息或实际结果。

您的想法是什么?

回答

3

你可能想看看comet

+3

多年后,你会想看看叫做[WebSockets]的彗星的标准格式(http://tools.ietf.org/html/rfc6455)。在[SuperWebSocket](http://superwebsocket.codeplex.com/)上有一个.NET实现。 – ladenedge 2012-09-30 05:16:00

1

我想的东西,这可能需要一个小时响应Web服务是不使用的最佳机制。

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

0

我一直在使用的一些Web服务在无法立即响应时返回“请再次尝试”xml消息。我意识到这只是对轮询技术的一种改进,但如果服务器可以在请求时确定可能的延迟将会发生什么,它可以告诉客户端,然后忘记它,从而将客户端轮询间隔过期后再询问一次。

0

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

为什么你想要用户等待这么长时间运行的任务?让他们在某处查找操作的状态。

2

我建议一种智能轮询的,如果可能的话:

  • 在第一次请求,返回一个标记来表示该请求。这是在将来的请求中呈现的内容,因此很容易检查该请求是否真的完成。
  • 在将来的请求,保持连接打开了一定的时间(例如一分钟,可能在客户端上指定的),并返回要么结果的“依然没有结果的结果,请再试一次X“,其中X是您完成答案时的最佳猜测。

优点:

  • 您允许客户端使用“保持连接开放”的模式相对昂贵(在连接方面),但允许响应,因为它已经准备好尽快送达。确保你不要在每个连接上都保留一个线程! (并且有某种时间限制...)
  • 通过说什么时候客户端应该回来,你可以实现退避策略 - 即使你不知道什么时候准备好,你可以有一个“回退1,2,4,8,16, 30,30,30,30 ...“分钟政策。 (您应该检查客户是否忽略这一点。)您不会因为长时间的错失而导致大量浪费的民意调查,但您仍然可以快速获得快速结果。