我有这段代码:
Response.AddHeader("Content-type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
Response.AppendHeader("Content-disposition", "attachment; filename=Bio.docx");
Response.BinaryWrite(lawyerBio.MakeDoc());
它适用于所有主流浏览器,但在IE8中失败。
IE8正在做什么是我第一次点击页面时,会出现一个弹出错误,上面写着:
Internet Explorer无法从“网站域名”下载“John-Smith”。
Internet Explorer无法打开此Internet站点。该 请求的网站不可用或无法找到。请试试 再来一次。
如果我点击OK,然后刷新页面,它会正确下载文件,文件名为Bio.docx。它第一次失败,每次都失败,每次都有第二次失效。 John-Smith是正在进行的页面的文件名,因此它看起来好像是第一次通过,它没有接受内容处理。
IE8是否有任何已知问题,或者你们可以看到我做错了什么?
干杯
更新
以下是使用此文件发送的标头:
Array
(
[0] => HTTP/1.1 200 OK
[1] => Cache-Control: no-cache, no-store
[2] => Pragma: no-cache
[3] => Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document
[4] => Expires: -1
[5] => Server: Microsoft-IIS/7.5
[6] => Set-Cookie: website#sc_wede=1; path=/
[7] => Set-Cookie: website#lang=en; path=/
[8] => Set-Cookie: ASP.NET_SessionId=zabhwz55brq0ebfyjqn1c3bm; path=/; HttpOnly
[9] => Content-Disposition: attachment; filename=Bio.docx
[10] => X-AspNet-Version: 2.0.50727
[11] => Set-Cookie: SC_ANALYTICS_GLOBAL_COOKIE=323F079A90B545F39F8A6A9EB9B919DB; expires=Fri, 26-Oct-2012 17:44:57 GMT; path=/
[12] => Set-Cookie: SC_ANALYTICS_SESSION_COOKIE=118B88825A054BA1BAF327B0561C3EBB,1; path=/
[13] => X-Powered-By: ASP.NET
[14] => Date: Thu, 27 Oct 2011 17:44:57 GMT
[15] => Connection: close
[16] => Content-Length: 169581
)
答案 0 :(得分:0)
试试这个(而不是BinaryWrite
)...(如果文件不直接在磁盘上,您可以随时将MemoryStream
换成FileStream
。
byte[] buffer = new byte[4096];
using (Stream s = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
int bytes;
while ((bytes = s.Read(buffer, 0, buffer.Length)) > 0)
{
Response.OutputStream.Write(buffer, 0, bytes);
}
}
Response.Flush();
答案 1 :(得分:0)
我认为问题是Cache-Control标头。见MSKB #323308。尽管它的标题,我在网上发现了一些帖子,表明不缓存下载文件也可能导致非SSL网站在Internet Explorer中失败。我会尝试添加知识库文章建议的注册表值BypassHTTPNoCacheCheck
- 如果有效,则需要从响应中删除缓存标题。