上下文 从我的javascript Web UI,我启动了在.NET2.0后端进行的长时间运行(几分钟)操作。当长时间运行并行运行时,调用立即返回操作ID。这些操作不是CPU密集型的,而是进行慢速网络呼叫。操作完成后,我希望在Web UI中看到结果。
问题:如何在作业完成后通知客户?
我考虑的选项:
选项1 :我直接从JS异步启动长时间运行的操作,我希望返回值是endresult而不是操作ID。我的AJAX库可以处理所有事情,生活看起来非常简单和整洁。问题是在服务器端线程是一个ThreadPool线程,我现在锁定几分钟。即使有足够的处理能力,您也不需要太多长时间运行的并行请求来导致ThreadPool饿死并使整个服务器陷入困境。
选项2 :使用操作ID,如果操作完成,我将开始轮询服务器。但是,这是针对我自己的服务器的拒绝服务攻击。此外,必须有公平的ajax解决方案。这不是一个独特的问题。
答案 0 :(得分:3)
轮询如果操作正确,将不会对您的服务器负载产生明显影响。您应该自定义间隔以最好地覆盖服务器作业的细节 - 例如如果您知道操作通常需要更长时间,则不要轮询服务器至少2分钟。即使在那之后你选择了足够大的间隔 - 例如10秒使用Web服务请求或自定义处理程序可以最大限度地减少处理请求所需的流量和服务器时间。
答案 1 :(得分:3)
查看WebSync,这是.NET的彗星实现。应该是你正在寻找的。 p>
答案 2 :(得分:2)
如果您没有太多并发客户端,也许反向ajax很有用。这有时被称为彗星。
反向Ajax是指使用长期HTTP连接的Ajax设计模式,以实现Web服务器和浏览器之间的低延迟通信。基本上它是一种从客户端发送数据到服务器的方式,以及一种将服务器数据推送回浏览器的机制(你需要的)。
http://en.wikipedia.org/wiki/Reverse_Ajax
听起来它可能适合您的需求,我只是使用它并且效果非常好。
答案 3 :(得分:0)
隐藏(或小)iframe运行长时间运行的脚本并使javascript只检查iframe的内容怎么样?例如脚本将ID写入iframe的结尾。
答案 4 :(得分:0)
您的选项2正是我之前所做的。使用setTimeout将轮询限制为每30秒左右。
答案 5 :(得分:0)
ICEfaces Framework提供了AJAX Push技术。它们支持Jetty,Tomcat和Glassfish等各种应用服务器上的可扩展异步请求处理。
虽然这是所有Java的东西,但它可能有助于为谷歌找到合适的搜索字词。