gpt4 book ai didi

google-chrome - 对同一资源发出多个请求时 Chrome 会停止运行?

转载 作者:行者123 更新时间:2023-12-03 07:05:33 29 4
gpt4 key购买 nike

我第一次尝试实现长轮询,并且我使用 XMLHttpRequest 对象来实现它。到目前为止,我已经成功地获取了 Firefox 和 Internet Explorer 11 中的事件,但奇怪的是,这次 Chrome 却显得有些奇怪。

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

screenshot

“停滞”的持续时间最长可达 20 秒。它不会在每个请求上发生,但通常会在一个选项卡中的连续多个请求上发生。

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

我认为这可能是我提出或提供请求的方式存在问题。作为引用,请求 header 如下所示:

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

尽管涉及到 header ,但我没有使用浏览器的 native EventSource,而是使用了一个可以让我设置附加 header 的 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 可能会尊重我设置的“无缓存” header 。

最佳答案

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

供将来引用,这是 Chrome 39.0.2171.95。

编辑:自从这个答案以来,我开始明白“Cache-Control:no-cache”并没有像我想象的那样做。尽管它的名称如此,但具有此 header 的响应可以被缓存。我没有尝试过,但我想知道使用“Cache-Control: no-store”(它确实可以防止缓存)是否可以解决问题。

关于google-chrome - 对同一资源发出多个请求时 Chrome 会停止运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513994/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com