Google chrome 对同一资源发出多个请求时Chrome暂停?

Google chrome 对同一资源发出多个请求时Chrome暂停?,google-chrome,google-chrome-devtools,long-polling,Google Chrome,Google Chrome Devtools,Long Polling,我第一次尝试实现长轮询,并使用XMLHttpRequest对象来实现。到目前为止,我已经成功地在Firefox和InternetExplorer11中获得了活动,但奇怪的是,这次Chrome是唯一出局的 我可以加载一个页面,它运行得很好。它立即发出请求并开始处理和显示事件。如果我在第二个选项卡中打开页面,其中一个页面开始看到接收事件的延迟。在“开发工具”窗口中,我看到多个具有这种计时方式的请求: “失速”将持续20秒。它不会发生在每个请求上,但通常会发生在一行和一个选项卡中的多个请求上 起初我

我第一次尝试实现长轮询,并使用XMLHttpRequest对象来实现。到目前为止,我已经成功地在Firefox和InternetExplorer11中获得了活动,但奇怪的是,这次Chrome是唯一出局的

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

“失速”将持续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
响应如下所示:

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'schrome://net-internals/#events 页面显示存在超时错误:

t=33627 [st=    5]      HTTP_CACHE_ADD_TO_ENTRY  [dt=20001]
                --> net_error = -409 (ERR_CACHE_LOCK_TIMEOUT)
错误消息指的是六个月前添加到Chrome()中的补丁,当同一资源被多次请求时,该补丁会执行20秒超时。事实上,补丁试图修复的bug()中有一个提到了类似的情况,补丁旨在减少等待的时间


这里的答案(或解决方法)可能只是让请求看起来不同,尽管Chrome可能会尊重我正在设置的“无缓存”标题。

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

作为将来的参考,这是铬39.0.2171.95


编辑:从这个答案开始,我开始理解“缓存控制:无缓存”并不像我想象的那样。不管名称如何,都可以缓存具有此标头的响应。我还没有尝试过,但我想知道使用“缓存控制:无存储”是否可以解决这个问题,它确实会阻止缓存。

添加
缓存控制:无缓存,没有转换
对我有效

我决定保持简单,并检查了一个没有此问题的网站的响应标题,我更改了响应标题以匹配他们的标题:

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

上面说46104号没有问题,请按照我在上面链接的问题底部的错误链接,或者让我看看现在是否可以直接链接:这和我在这里的经历一样吗?在Chrome 75.0.3770.100中使用Chrome 42,上述方法中的任何一种都不起作用-有没有办法解决这个问题?这是否意味着,如果你通过在键盘上垃圾邮件[F5]反复请求你的站点,Chrome在加载时会在视觉上“挂起”?我不这么认为。更像是同时在多个选项卡中加载同一页面。当同时向同一URL发出多个请求时,会发生缓存挂起。在我的例子中,这些是长轮询响应,所以在第二个请求中,Chrome会等待第一个请求完成,看看是否可以重用响应。第一个请求需要超过20秒才能完成,Chrome会等那么长时间才放弃。
Cache-Control:no-store
对我来说不管用!非常有用的回答很好,谢谢:DI遇到了这个问题,
Cache Control:no Cache,no store
对我有效。非常感谢!我故意在服务器上设置了10秒的“睡眠”,发现如果我同时用相同的url刷新两个chrome窗口,第一个需要10秒,第二个需要20秒。我可以从服务器日志中看到,chrome在第一个请求完成之前不会发送第二个请求,尽管它在第二个窗口中显示了整整20秒的“挂起”状态。这与HTTP头无关。如果URL不同或使用firefox,则不会发生这种情况。