【问题标题】:Write Word Doc On The Fly即时编写 Word Doc
【发布时间】:2023-03-11 08:10:02
【问题描述】:

我有这段代码:

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 站点。这 请求的站点不可用或找不到。请试试 稍后再来。

如果我点击确定,然后刷新页面,它会很好地下载文件,文件名为 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
)

【问题讨论】:

  • 您会注意到 IE8 并未与“所有主要浏览器”混为一谈;)
  • 您使用的是 SSL 还是 Cache-Control 标头?
  • 没有 SSL,但我会从 FF Web Dev 获取标题的副本并将它们附加到原始问题中。

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


【解决方案1】:

我认为问题在于 Cache-Control 标头。见MSKB #323308。尽管有它的标题,但我在网上发现了许多帖子,这些帖子表明不缓存下载文件可能会导致非 SSL 网站在 Internet Explorer 中也失败。我会尝试添加 KB 文章建议的注册表值 BypassHTTPNoCacheCheck - 如果它有效,您将需要从响应中删除缓存标头。

【讨论】:

  • 我认为你是对的,但我无法说服我的客户在生产网络服务器上弄乱他们的注册表。知道如何通过代码将其关闭吗?
  • 根据php.net/manual/en/function.header.php#99190,删除 Cache-Control 和 Pragma 标头应该可以解决问题。
  • 接受这个作为答案,因为这就是它失败的原因。如何修复它要复杂得多,但我有一种感觉是 IIS、C# 和 SiteCore 之间的混合——但这是特定于我的解决方案而不是问题,这是其他人将要搜索和找到的问题这个。
【解决方案2】:

试试这个(而不是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();

【讨论】:

  • 我尝试使用 MemoryStream() 运行它,但仍然得到相同的结果。
  • 尝试在每次调用时更改文档的名称,看看是否是缓存问题。而不是 bio.docx 使它成为Guid.NewGuid() + ".docx"
  • 我已经实现了,IE8 在第一次运行时仍将其视为 john-smith,然后在后续运行时将其视为 guid.docx。
  • 你能分享你用来访问这个页面响应的 URL 吗?
猜你喜欢
  • 2023-03-21
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多