我正在编写一段代码来触发多个图像调用(像素),有时这些调用可能会因服务器可用性而潜伏。我已经设计了一个调用,如果所有调用都没有在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太聪明了,即使它们不再有效也能跟踪电话?其他内容是否会继续运行,或者浏览器会阻止其他内容,因为呼叫技术上没有返回?
答案 0 :(得分:1)
如果浏览器取消请求,Fiddler也会取消请求。
出现差异的原因是基于浏览器的工具如Firebug与基于代理的工具(如Fiddler)的工作方式。当您在浏览器中有跟踪请求时,这些工具仅包含浏览器提供的信息。许多较低级别的信息完全丢失。
Fiddler充当代理服务器,因此可以保证捕获每个请求(假设浏览器使用代理服务器进行所有类型的连接)。浏览器和服务器之间的数据流经Fiddler。但是,拥有代理服务器的性质可能会略微改变行为。对于必须接受Fiddler证书的HTTPS请求尤其如此。
如果您想确切知道发生了什么,您需要一个数据包嗅探器,它可以被动地监视通过线路发送的真实数据,而无需对其进行修改。我推荐Wireshark。然后,您将确定是否保持连接。
现在针对您的具体问题......即使在完成连接之后保持连接,也可能没有任何关于它的事情。为了表现,浏览者可以自由地实现他们想要的任何方法。这通常包括保持连接打开(HTTP Keep-Alive)。