是否有可能从同一页面“多路复用”许多AJAX请求?

时间:2009-09-07 06:51:33

标签: ajax http comet

我有一个页面已经同时发出多个AJAX请求。他们使用Comet模型,因此总是打开多个HTTP连接,等待来自服务器的更多数据。随着页面在未来变得越来越复杂,可能会有更多。我担心打开太多关系。

我想知道是否有办法“复用”它们,即。有一个连接,通过它可以发送所有请求,并将消息路由到服务器端和客户端的相应处理函数。

到目前为止,我无法找到一种方法,因为一旦我发出HTTP请求并开始等待数据,我认为不可能发送更多的请求数据。我可以在打开另一个连接之前关闭该连接以发送更多数据,但是如果服务器刚刚发送响应怎么办?

我想做一些我不应该做的事吗?

3 个答案:

答案 0 :(得分:1)

为什么您认为打开多个连接是不可能的?你试过了吗?

我们使用的方法是在概念上使用两个连接:一个用于Comet,所有异步传输都是多路复用的,因此会有许多不同的消息类型到达那里。请求/响应发生在另一方实际上我们只是写了一个传统的Ajax应用程序,Comet作为额外的。

答案 1 :(得分:0)

浏览器开发者达成了一致意见 - 只有2个同时请求可以发送到同一个子域。这就是多个AJAX请求有用的原因,但要记住队列。 另一方面,JScript调用受安全原因限制为单个子域。有一个小技巧可以超越这个限制(参见例如http://www.simple-talk.com/dotnet/asp.net/calling-cross-domain-web-services-in-ajax/部分“动态脚本标记黑客”)

答案 2 :(得分:0)

我最终做了 djna 描述的内容(至少我认为它是同一件事):让一个Comet风格的连接始终打开,一直在听取响应,但是正常情况下,使用新连接发送AJAX请求。每个请求立即返回“作业ID”(因此连接非常短暂),并且该“作业”的任何其他数据将沿Comet连接发送。这样在任何给定时间最多只有2个连接,除非同时发生2个AJAX请求,这在我的情况下是不可能的。

当然,可能有多个客户端同时使用该页面,因此要确定需要在彗星连接中发送哪些作业响应,我还有一个“彗星会话ID”。页面加载时生成此ID,并且在页面生命周期内不会更改。在创建作业的正常AJAX请求之后,我发送另一个非常简单的AJAX请求,其中包含作业ID和会话ID。这会将该作业与会话相关联,并告知服务器将该作业的所有响应发送到与该会话ID关联的已建立连接。

当然,我可以将会话ID作为初始请求的一部分,但这意味着服务器端的每个AJAX方法都需要知道它,我宁愿将它分开,作为一部分基础设施。