2010-03-11 109 views
2

我正在尝试使用COMET solution using ASP.NET彗星和同步Ajax请求

问题是我想实现发送和通知部分在同一页。 在IE7上,每当我尝试发送请求时,它都会排队等候。 在互联网和stackoverflow页面阅读后,我发现我只能每页做2个同步异步Ajax请求。

因此,直到我关闭了我的彗星Ajax请求,我的第二个请求没有完成,甚至没有从浏览器中出去。当我使用Firefox进行检查时,我只需要运行一个Ajax彗星请求..所以这不会让我多出一个Ajax请求?

另外该解决方案使用IRequiressessionstate来处理我已删除的异步HTTP处理程序。但它仍然在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?

+0

有2个项目,这可能对您有用: 彗星阿贾克斯ASP.NET:http://pokein.codeplex.com 开源IIS调整工具:http://iistuner.codeplex.com – Zuuum 2011-01-21 08:07:12

回答

5

您仅限于2个连接,但通常情况下,您只需要1个即可发送1个即可在IE中接收。

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

需要注意的是,IE(和其他浏览器,虽然它们通常限制为6个请求,而不是2个)限制每个域的请求 - 但该限制是针对整个域,不包括子域。因此,例如,您可以向“www.stackoverflow.com”打开2个请求,并在同一时间打开2个“static.stackoverflow.com”请求。

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

编辑

与IE> 1个实例管理回来同样的问题。该限制适用于所有实例。所以,如果你有两个浏览器打开,并且它们都使用彗星,你会被打开两个长轮询连接。如果你已经最大化了你的选择,你将会把这些长轮询请求连接到“comet.mysite.com”之类的东西,而你的非长轮询请求将会转到“mysite.com”。没有进入通配符DNS,这是最好的。

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

+0

Thx.I可以使用IE的一个实例进行发送和接收,但不会超过此限制。 – Amitd 2010-03-11 13:54:13

2

彗星的主要思路是保持一个客户端到服务器的请求开放,直到响应是必要的。

如果您正确设计代码,则不需要超过2个请求同时打开。下面是它如何工作的:

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

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

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

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

+0

是的,我同意,客户端重复请求的一部分运行良好。 问题是,我不能再开放一个连接到服务器 (不Comet ..simple ajax)同时发送数据到它。 – Amitd 2010-03-11 13:44:09

+0

有解决方法,请参阅上面的我的答案。 – jvenema 2010-10-28 16:39:16