当对同一资源发出多个请求时,Chrome会停止?

时间:2014-12-16 21:11:44

标签: google-chrome google-chrome-devtools long-polling

我第一次尝试实施长轮询,并且我正在使用XMLHttpRequest对象来执行此操作。到目前为止,我已经成功地在Firefox和Internet Explorer 11中获取了活动,但Chrome奇怪的是这次是奇怪的。

我可以加载一个页面,它运行得很好。它立即发出请求并开始处理和显示事件。如果我在第二个选项卡中打开页面,其中一个页面开始看到接收事件的延迟。在开发工具窗口中,我看到了这种时间的多个请求:

screenshot

"失速"最长可达20秒。它不会在每个请求中发生,但通常会连续发生在多个请求中,并且会出现在一个选项卡中。

起初我认为这是我的服务器的一个问题,但后来我打开了两个IE标签和两个Firefox标签,它们都连接并接收相同的事件而没有停顿。只有Chrome遇到这种麻烦。

我认为这可能是我制作或提供请求的方式的问题。作为参考,请求标头如下所示:

Connection: keep-alive
Last-Event-Id: 530
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
Accept: */*
DNT: 1
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

响应如下:

HTTP/1.1 200 OK
Cache-Control: no-cache
Transfer-Encoding: chunked
Content-Type: text/event-stream
Expires: Tue, 16 Dec 2014 21:00:40 GMT
Server: Microsoft-HTTPAPI/2.0
Date: Tue, 16 Dec 2014 21:00:40 GMT
Connection: close

尽管涉及到标题,我还没有使用浏览器的原生EventSource,而是使用了一个允许我设置其他标题的polyfill。 polyfill正在使用XMLHttpRequest,但在我看来,无论请求是如何进行的,它都不应该停顿20秒。

可能导致Chrome停滞的原因是什么?

修改:Chrome的chrome:// net-internals /#events页面显示出现超时错误:

t=33627 [st=    5]      HTTP_CACHE_ADD_TO_ENTRY  [dt=20001]
                --> net_error = -409 (ERR_CACHE_LOCK_TIMEOUT)

错误消息是指六个月前添加到Chrome的补丁(https://codereview.chromium.org/345643003),当多次请求同一资源时,该补丁实现了20秒的超时。事实上,补丁尝试修复的其中一个错误(bug number 46104)指的是类似的情况,补丁意味着减少等待的时间。

这里的答案(或解决方法)可能只是为了让请求看起来不同,尽管Chrome可能会尊重" no-cache"标题我设置。

3 个答案:

答案 0 :(得分:31)

是的,此行为是由于Chrome锁定缓存并等待再次请求相同资源之前查看一个请求的结果。答案是找到一种使请求唯一的方法。我在查询字符串中添加了一个随机数,现在一切正常。

为了将来参考,这是Chrome 39.0.2171.95。

修改:自从这个回答以来,我已经明白了这一点" Cache-Control:no-cache"没有做我认为的事情。尽管名称如此,但可以缓存此标头的响应。我还没有尝试,但我想知道是否使用" Cache-Control:no-store", 阻止缓存,将解决问题。

答案 1 :(得分:1)

添加Cache-Control: no-cache, no-transform为我工作

答案 2 :(得分:0)

我已决定保持简单,并检查了没有此问题的网站的响应标头,并更改了响应标头以使其与之匹配:

Cache-Control: max-age=3, must-revalidate