1

我正在编写一段代码来触发多个图像调用(像素),有时这些调用可能会根据服务器的可用性而隐藏。我设计了一个调用,如果所有调用都没有在 5 秒内完成,页面会通过 location.replace 重定向到一个空的 HTML 页面。

整个东西都包裹在一个 iFrame 中,当我在 Firebug 中对其进行测试时,它似乎运行良好。当我在 Fiddler 中查看呼叫时,时间显示为服务器回复所需的全部时间(即使浏览器不再等待呼叫)。

浏览器中到底发生了什么?是否可以自由地继续做其他需要做的事情?即使 iframe 已通过 location.replace 更改,它是否真的仍在等待呼叫返回?

假设这是 iFrame 中的代码,并且 iFrame 放置在另一个页面上。

<html>
<body>
    <img src="http://localhost:8080/MyServer/MyFirstCall" width="1" height="1"/>
    <img src="http://localhost:8080/MyServer/MySecondCall" width="1" height="1"/>
    <script>
        window.setTimeout("if(true) {location.replace('http://somewhere/empty.html');}", 5000);
    </script>
</body>
</html>

Firebug 会告诉我一切正常,并且 empty.html 已加载(当然我正在调试并强制调用在 5 秒后返回)。

另一方面,Fiddler 会告诉我 FirstCall 或 SecondCall 的总经过时间是 30 秒(或者每当我决定让调试器离开时)。

浏览器真的在等待吗?它不是在等待吗?Fiddler 是否太聪明了,即使呼叫不再有效也会跟踪呼叫?其他内容会继续运行,还是浏览器会因为技术上没有返回调用而阻止其他内容?

4

1 回答 1

1

如果浏览器取消请求,Fiddler 也会取消请求。

差异的原因是基于浏览器的工具(如 Firebug)与基于代理的工具(如 Fiddler)的工作方式。当您在浏览器中跟踪请求时,这些工具仅具有浏览器提供的信息。许多较低级别的信息完全丢失了。

Fiddler 充当代理服务器,因此可以保证捕获每个请求(假设浏览器正在使用代理服务器进行所有类型的连接)。浏览器和服务器之间的数据通过 Fiddler 流动。但是,拥有代理服务器的性质可能会稍微改变行为。对于必须接受 Fiddler 证书的 HTTPS 请求尤其如此。

如果您想确定发生了什么,您需要一个数据包嗅探器,它可以被动地监视通过网络发送的真实数据,而无需对其进行修改。我为此推荐 Wireshark。然后您将确定是否保持连接。

现在针对您的具体问题...即使在您完成连接之后仍保持连接,您也可能无法或应该做任何事情。为了性能,浏览器可以自由地实现他们想要的任何方法。这通常包括保持连接打开(HTTP Keep-Alive)。

于 2013-10-18T02:13:08.763 回答