Chrome在对同一资源进行多个请求时会停止运行?

cetgtptt  于 2023-08-01  发布在  Go
关注(0)|答案(4)|浏览(163)

我第一次尝试实现长轮询,我使用XMLHttpRequest对象来实现它。到目前为止,我已经成功地在Firefox和Internet Explorer 11中获得了事件,但奇怪的是,Chrome这次是一个例外。
我可以加载一个页面,它运行得很好。它立即发出请求并开始处理和显示事件。如果我在第二个选项卡中打开页面,其中一个页面开始看到接收事件的延迟。在开发工具窗口中,我看到多个具有这种定时的请求:
x1c 0d1x的数据
“失速”的范围将达到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可能会尊重我设置的“无缓存”头。

k3bvogb1

k3bvogb11#

是的,这是因为Chrome锁定该高速缓存,并在再次请求相同资源之前等待查看一个请求的结果。答案是找到一种使请求唯一的方法。我在查询字符串中添加了一个随机数,现在一切正常。
为了将来的参考,这是Chrome 39.0.2171.95。

编辑:从这个答案开始,我明白了“Cache-Control:“无缓存”并不像我想的那样。尽管它的名字,响应与此头可以缓存。我没有试过,但我想知道如果使用“Cache-Control:no-store”(确实阻止了缓存)可以解决这个问题。

mwngjboj

mwngjboj2#

添加Cache-Control: no-cache, no-transform对我有效

5cnsuln7

5cnsuln73#

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

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

字符串

vaqhlq81

vaqhlq814#

我遇到了同样的问题。Cache-Control头没有帮助。但我只是添加了额外的查询参数与随机值,并使所有的请求唯一。而且成功了

GET /long-polling?rand=123

GET /long-polling?rand=456

字符串
Chrome将它们视为不同的请求。

相关问题