在我的应用程序中,我需要定期发出跨域HTTP POST请求,以从服务器接收最新数据(定期轮询)。该应用程序在Chrome中时无法在IE8中工作。所以我决定用Wireshark:进行调试
我在IE8和Chrome中执行了两个等效的代码。我用Wireshark监控我的网络。wireshark过滤器是:
http.request.full_uri == "http://www.andlabs.net/html5/uCOR.php"
我注意到IE8只发送一次请求,并为以下调用返回相同的缓存响应。另一方面,Chrome每次都会发送一个新的请求。
我用于IE8:的代码
var cor = new XDomainRequest();
cor.onload = function() { alert(cor.responseText);}
cor.open('POST', 'http://www.andlabs.net/html5/uCOR.php');
cor.send();
我用于Chrome的代码:
var cor = new XMLHttpRequest();
cor.onload = function() { alert(cor.responseText);}
cor.open('POST', 'http://www.andlabs.net/html5/uCOR.php');
cor.send();
为了防止IE8中的缓存响应,我尝试了以下代码,结果成功了:
var cor = new XDomainRequest();
cor.onload = function() { alert(cor.responseText);}
cor.open('POST', 'http://www.andlabs.net/html5/uCOR.php');
cor.send(''+new Date());
为什么IE8会这样做?有什么方法可以用与我不同的方式解决这个问题吗?请注意,我不能对GET请求使用相同的技巧。
顺便说一下,IE的请求和响应如下:
请求:
POST /html5/uCOR.php HTTP/1.1
Accept: */*
Origin: http://jsbin.com
Accept-Language: en-US
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)
Host: www.andlabs.net
Content-Length: 0
Connection: Keep-Alive
Cache-Control: no-cache
响应:
HTTP/1.1 200 OK
Content-Type: text/html
Server: Microsoft-IIS/7.0
Access-Control-Allow-Origin: *
X-Powered-By: ASP.NET
Date: Tue, 17 Jan 2012 21:41:39 GMT
Content-Length: 180
This is a page from www.andlabs.net which is accessible from any website through Cross Origin Requests<br>This page contains the following header:<br>Access-Control-Allow-Origin: *
响应上似乎没有任何缓存头,因此浏览器的行为可能会有所不同。您可以将以下标题添加到响应中吗:Cache-Control: no-cache