private static void writeData( byte[] file, HttpServletResponse response )
throws IOException
{
....
// Send the data
response.setContentLength(file.length);
response.getOutputStream().write(file);
}
最近,我在IE8中发现某些连接在请求下载文件时关闭。这是代码中的相关源代码,我想知道是否一次性将大字节数组写入响应输出流可能会导致此问题。这个问题非常不可重复,而且我经常看到一次写入一定数量字节的模式,而不是同时写入,以避免MTU问题,或类似的事情。
此代码是否可能导致我的间歇性IE问题?如果是这样,为什么,为什么只在IE?
修改
我尝试使用Cache-Control: no-cache
,结果在IE中是灾难性的。
请求:
POST /myapplication/someAction.do?step=none&SAct=none HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/x-shockwave-flash, */*
Referer: https://myhost.myhost.com/myapplication/someAction.do?queryString=something
Accept-Language: en-US
User-Agent: Mozilla/4.0 (compatible; MSIE 8.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; MS-RTC LM 8; .NET4.0C; InfoPath.3)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: myhost.myhost.com
Content-Length: 1644
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=GnvHMYyGx9QrmpVQfBSgNXnPM8nQJ21dT82KhmSSTXRRT1mgB8tP!299858932; [truncated]
响应:
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Tue, 21 Sep 2010 18:00:56 GMT
Transfer-Encoding: chunked
Content-Type: application/ZIP
Content-Disposition: inline; filename=ActivityReport.ZIP
X-Powered-By: Servlet/2.5 JSP/2.1
答案 0 :(得分:1)
您是否设置了响应的缓存信息? (日期,缓存控制等)
我在IE中看到了很多这种行为,并且总是与IE的缓存实现有关,而不是发送HEAD请求来检查内容的有效性,它发送完整的GET请求然后使用标头来确定其缓存内容的有效性,如果它决定缓存版本是有效的,那么只需关闭连接,因此服务器端会出现很多“破管”样式错误。
要验证是这种情况,请尝试发送缓存控制标头,以便IE始终必须下载完整内容。
答案 1 :(得分:0)
应用程序进行的写入(和刷新)模式可能会对数据包的形成和发送方式产生影响,但这似乎是最好的设置:内核具有有关要从中发送的数据的完整信息一开始,可以自由选择数据的最佳分组。
这似乎不太可能是客户问题的原因。发送可能会刷新大量微小数据包的分块输出会更加可疑。