Comet和同时的Ajax请求

时间:2010-03-11 13:05:41

标签: c# asp.net ajax iis comet

我正在尝试使用COMET solution using ASP.NET

麻烦的是我想在同一页面中实现发送和通知部分。 在IE7上,每当我尝试发送请求时,它就会排队等候。 在互联网和stackoverflow页面上阅读后,我发现每页只能同时执行2个asyn ajax请求。

所以在我关闭我的彗星Ajax请求之前,我的第二个请求没有完成,甚至没有从浏览器中出来。当我用Firefox检查时,我只是一个Ajax彗星请求一直在运行。那么这不会给我留下另外一个ajax请求吗?

该解决方案还使用了IRequiressessionstate for Asynchronous HTTP Handler,我已将其删除。但它仍然会在IE7的多个实例上产生问题。

我有一个工作在这里陈述http://support.microsoft.com/kb/282402
这意味着我们可以默认增加注册表中的请求限制为2 通过更改“ MaxConnectionsPer1_0Server ”键
在配置单元“HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Internet Settings” 我们可以增加请求数量。

基本上我想使用Comet向连接到服务器的多个客户端广播信息,客户端也可以向服务器发送消息。
广播有效,但发送请求回服务器不起作用。

我正在使用IIS 6和ASP.NET。

是否有更多变通办法或方式来发送更多请求?

参考文献:

How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

AJAX, PHP Sessions and simultaneous requests

jquery .ajax request blocked by long running .ajax request

jQuery: Making simultaneous ajax requests, is it possible?

2 个答案:

答案 0 :(得分:5)

您只能使用2个连接,但通常只需要1个即可,即使在IE中也可以1个接收。

那就是说,你可以完全做到这一点;我们一直在WebSync做这件事。解决方案在于子域。

要注意的是IE(和其他浏览器,虽然它们通常限制为6个请求,而不是2个)限制每个域的请求 - 但是这个限制是针对整个域排除子域。例如,您可以向“www.stackoverflow.com”打开2个请求,同时向“static.stackoverflow.com”打开另外2个请求。

现在,你必须要小心这种方法,因为如果你从www子域向静态子域发出请求,那么这被认为是跨域请求,所以你立即被限制为不使用直接XHR呼叫,但此时您已绕过2连接限制; JSONP,HTML5等都是您绕过跨域限制的朋友。

修改

使用>进行管理1个IE实例回到了同样的问题。该限制适用于所有实例。因此,如果您打开了两个浏览器,并且它们都使用了彗星,那么您将无法打开2个长轮询连接。如果您已经最大化了选项,那么您将把这些长轮询请求连接到类似“comet.mysite.com”的内容,并且您的非长轮询请求将转到“mysite.com”。如果不进入通配符DNS,那将是最好的。

查看我们的一些WebSync Demos;他们在2个IE实例中工作没有问题。如果您查看源,您将看到流连接的DNS与主页不同;我们使用JSONP来绕过跨域限制。

答案 1 :(得分:2)

COMET的主要思想是保持一个客户端到服务器的请求打开,直到需要响应。

如果您正确设计了代码,那么您不需要同时打开2个以上的请求。以下是它的工作原理:

  • 客户端使用中央消息发送 - 接收循环向服务器发送请求
  • 服务器接收请求并保持打开状态。
  • 在某些时候,服务器响应客户端。
  • 客户端(浏览器)接收响应,在其中央消息循环中处理它。
  • 客户端立即发出另一个请求。
  • 重复

关键是集中和异步客户端中的所有通信。所以你永远不需要有2个开放请求。

但要直接回答您的问题,不,没有其他解决方法。

提高连接限制或减少使用的连接数。