在飞行中写Word文档

时间:2011-10-27 15:35:42

标签: c# asp.net file-io http-headers

我有这段代码:

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
)

2 个答案:

答案 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 - 如果有效,则需要从响应中删除缓存标题。