如何在没有投票的情况下通知我的JS客户端?

问题描述:

上下文: 从我的JavaScript Web UI中,我启动了一个在.NET2.0后端进行的长时间运行(几分钟)操作。该调用立即返回操作ID,而长时间运行并行运行。这些操作不是CPU密集型的,但是进行缓慢的网络呼叫。操作完成后,我想在Web UI中查看结果。如何在没有投票的情况下通知我的JS客户端?

问题:如何在工作完成后通知客户?

选项我已考虑:

选项1:我异步直接从JS启动长时间运行的操作,我希望返回值是endresult,而不是操作ID。我的AJAX库负责处理所有事情,生活看起来非常简单,整洁。问题是,在服务器端线程是一个ThreadPool线程,我现在锁定了几分钟。即使有足够的处理能力,您也不需要太多长时间运行的并行请求,导致ThreadPool陷入饥饿状态,并将整个服务器带回其膝部。

选项2:使用操作ID,我开始轮询服务器,如果操作完成。但是,这是对我自己的服务器的拒绝服务攻击。此外,它必须有公平的Ajax解决方案。这不是一个独特的问题。

检出WebSync,一个.NET的彗星实现。应该是你正在寻找的。

隐藏的(或小的)iframe如何运行长时间运行的脚本并使javascript仅检查iframe的内容?例如脚本在其末尾将ID写入iframe。

轮询,如果正确完成,将不会对您的服务器负载有明显的影响。您应该自定义时间间隔以最好地覆盖您的服务器作业的具体内容 - 例如如果您知道该操作通常需要更长时间,则至少需要2分钟才能轮询服务器。即使在此之后,你选择了足够大的间隔 - 例如10秒。使用Web服务请求或自定义处理程序可以最大限度地减少处理请求所需的通信量和服务器时间。

你的选择2正是我以前所做的。使用setTimeout限制每30秒左右的轮询。

也许反向ajax是有用的,如果你不会有太多的并发客户端。这有时被称为彗星。

反向Ajax指的是一种Ajax设计模式,它使用长期HTTP连接来启用Web服务器和浏览器之间的低延迟通信。基本上它是一种将数据从客户端发送到服务器的方式,以及将服务器数据推送回浏览器的机制(您需要)。

http://en.wikipedia.org/wiki/Reverse_Ajax

听起来像它可能满足您的需求,我只是用它和它的工作非常出色。

+0

我见过一些基于浏览器的即时通讯客户端发出长时间超时的服务器HTTP请求。只要服务器有一些数据推送到客户端,服务器就可以回复。我想这是一回事。 – 2009-08-26 11:52:01

+0

是的,它可以被看作是从服务器到客户端的推送。当然你仍然需要长寿命的http连接,这就是为什么你不需要成千上万的同时连接。 – 2009-08-26 12:33:55

ICEfaces Framework提供AJAX Push技术。他们支持可扩展异步请求处理在各种应用程序服务器,如Jetty,Tomcat和Glassfish。

虽然这是所有的Java的东西,它可能有助于找到正确的谷歌搜索条件。