4

上下文: 从我的 javascript Web UI 中,我启动了一个在 .NET2.0 后端进行的长时间运行(几分钟)的操作。当长时间运行的操作并行运行时,调用会立即返回操作 ID。这些操作不是 CPU 密集型的,但会进行缓慢的网络调用。操作完成后,我想在 Web UI 中查看结果。

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

我考虑过的选项:

选项 1:我直接从 JS 异步启动长时间运行的操作,我希望返回值是最终结果而不是操作 ID。我的 AJAX 库处理一切,生活看起来非常轻松和整洁。问题是在服务器端线程是一个 ThreadPool 线程,我现在锁定了几分钟。即使有足够的处理能力,您也不需要太多长时间运行的并行请求来导致 ThreadPool 饿死并使整个服务器瘫痪。

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

4

6 回答 6

3

轮询,如果正确完成,不会对您的服务器负载产生明显影响。您应该自定义时间间隔以最好地涵盖服务器作业的细节 - 例如,如果您知道操作通常需要更长的时间,则至少 2 分钟不要轮询服务器。即使在那之后你选择一个足够大的间隔——例如10秒。使用 Web 服务请求或自定义处理程序将最大限度地减少处理请求所需的流量和服务器时间。

于 2009-08-26T11:05:14.647 回答
3

查看WebSync,一个 .NET 的彗星实现。应该正是您正在寻找的。

于 2009-11-20T16:40:02.717 回答
2

如果您不会有太多并发客户端,那么反向 ajax 可能会很有用。这有时被称为彗星。

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

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

听起来它可能适合您的需求,我刚刚使用它并且效果非常好。

于 2009-08-26T11:11:00.813 回答
0

让隐藏(或小)iframe 运行长时间运行的脚本并让 javascript 仅检查 iframe 的内容怎么样?例如,脚本将 ID 写入 iframe 的末尾。

于 2009-08-26T11:00:04.720 回答
0

您的选项 2 正是我之前所做的。使用 setTimeout 将轮询限制为每 30 秒左右。

于 2009-08-26T11:05:29.437 回答
0

ICEfaces 框架提供了AJAX推送技术。它们支持各种应用服务器(如 Jetty、Tomcat 和 Glassfish)上的可扩展异步请求处理

虽然这都是 Java 的东西,但它可能有助于为 google 找到正确的搜索词。

于 2009-08-26T11:14:57.390 回答