3

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

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

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

我是否正在尝试做我不应该做的事情?

4

3 回答 3

1

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

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

于 2009-09-07T06:59:07.833 回答
0

我最终做了djna描述的事情(至少我认为这是同一件事):始终打开一个 Comet 式连接,该连接一直在侦听响应,但像往常一样使用新连接发送 AJAX 请求。每个请求都会立即返回一个“作业 ID”(因此连接非常短暂),并且该“作业”的任何进一步数据都将通过 Comet 连接发送。这样,在任何给定时间最多有 2 个连接,除非同时发生 2 个 AJAX 请求,这在我的情况下不太可能。

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

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

于 2009-09-09T00:53:07.847 回答
0

浏览器开发人员达成了一项协议 - 只能将 2 个同时请求发送到同一个子域。这就是为什么多个 AJAX 请求很有用,但请记住队列。另一方面,由于安全原因,JScript 调用仅限于单个子域。有一个小技巧可以跳过这个限制(参见例如http://www.simple-talk.com/dotnet/asp.net/calling-cross-domain-web-services-in-ajax/部分“动态脚本标签黑客”)

于 2009-09-07T07:03:32.517 回答