我正在尝试首次实现长轮询,并使用XMLHttpRequest对象来执行。到目前为止,我成功地在Firefox和Internet Explorer 11中获取了事件,但是Chrome这一次变得异常。
我可以加载一个页面,它可以正常运行。它立即发出请求并开始处理和显示事件。如果我在第二个标签中打开页面,则其中一个页面开始接收事件的延迟。在开发工具窗口中,我看到多个具有此类型计时的请求:
一开始我以为这是我的服务器出了问题,但是我打开了两个 IE 标签页和两个 Firefox 标签页,它们都可以连接并接收相同的事件而没有停顿。只有 Chrome 出现了这种问题。
我认为这很可能是由于我发起或提供请求的方式所导致的问题。供参考的是,请求头如下:
响应如下:
尽管涉及标题,但我没有使用浏览器的原生EventSource,而是使用了一个可以让我设置额外标题的polyfill。该polyfill在底层使用XMLHttpRequest,但我认为无论请求是如何进行的,它都不应该停顿20秒钟。可能是什么原因导致Chrome这样停滞吗? 编辑: Chrome的chrome://net-internals/#events页面显示存在超时错误。
错误信息是指向六个月前Chrome添加的一个补丁 (https://codereview.chromium.org/345643003),该补丁在同一资源被多次请求时实现了 20 秒超时。事实上,补丁试图修复的一个错误 (bug number 46104) 涉及类似的情况,而该补丁旨在 减少 等待时间。
可能的答案(或解决方法)是使请求看起来不同,尽管也许 Chrome 可以尊重我设置的“no-cache”头。
我可以加载一个页面,它可以正常运行。它立即发出请求并开始处理和显示事件。如果我在第二个标签中打开页面,则其中一个页面开始接收事件的延迟。在开发工具窗口中,我看到多个具有此类型计时的请求:
一开始我以为这是我的服务器出了问题,但是我打开了两个 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”头。