【发布时间】:2010-11-15 04:41:01
【问题描述】:
我在 ASP.NET 2.0 中将 PDF 流式传输到浏览器。这适用于所有通过 HTTP 的浏览器和所有浏览器除了通过 HTTPS 的 IE。据我所知,这曾经在所有版本的 IE 中都有效(过去 5 年左右),但我们的客户最近才开始报告问题。我怀疑 不将加密的页面保存到磁盘 安全选项在默认情况下是禁用的,并且在某些时候默认启用(Internet 选项 -> 高级 -> 安全)。作为一种变通方法,关闭此选项会有所帮助,但作为长期解决方案不可行。
我收到的错误信息是:
Internet Explorer 无法从 www.sitename.com 下载 OutputReport.aspx。
Internet Explorer 无法打开此 Internet 站点。请求的站点不可用或找不到。请稍后再试。
用于创建 PDF 的工具是来自DataDynamics 的 ActiveReports。创建 PDF 后,下面是发送它的代码:
Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()
注意:如果我没有明确指定缓存控制,那么 .NET 会代表我发送无缓存,所以我尝试将缓存控制设置为:私有或公共或 maxage=#,但似乎没有一个工作。
这是一个转折点:当我运行 Fiddler 来检查响应标头时,一切正常。我收到的标题是:
HTTP/1.1 200 正常
缓存控制:max-age=1
日期:格林威治标准时间 2009 年 7 月 29 日星期三 17:57:58
内容类型:application/pdf
服务器:Microsoft-IIS/6.0
MicrosoftOfficeWebServer:5.0_Pub
X-Powered-By:ASP.NET
X-AspNet-版本:2.0.50727
内容处置:附件;文件名=statement.pdf
内容编码:gzip
变化:接受编码
传输编码:分块
只要我关闭 Fiddler 并重试,它就会再次失败。我注意到的另一件事是,当 Fiddler 运行时,我收到 此网站的安全证书存在问题 警告消息,我必须单击 继续访问此网站(不推荐) 通过。当 Fiddler 关闭时,我不会遇到此安全警告并且它会立即失败。
我很好奇 Fiddler 和浏览器之间发生了什么,因此它在 Fiddler 运行时可以工作,但在不运行时会中断,但更重要的是,有没有人知道如何更改我的代码以便将 PDF 流式传输到 IE 可以工作不更改客户端机器?
更新: Fiddler 问题已解决,非常感谢 EricLaw,所以现在它的行为始终如一(损坏,无论 Fiddler 是否运行)。
根据 Google 搜索,整个网络上似乎有很多关于同一问题的报告,每个报告都有自己特定的响应标头组合,似乎可以针对各自的情况解决问题。我已经尝试了许多这些建议,包括添加 ETag、LastModified 日期、删除 Vary 标头(使用 Fiddler)以及 Cache-Control 和/或 Pragma 标头的数十种组合。我尝试了 ContentType 的“Content-Transfer-Encoding: binary”以及“application/force-download”。到目前为止没有任何帮助。有一个fewMicrosoftKBarticles,都表明Cache-Control: no-cache是罪魁祸首。还有其他想法吗?
更新:顺便说一下,为了完整起见,Excel 和 Word 输出也会出现同样的问题。
更新:没有取得任何进展。我将 .SAZ 文件从 Fiddler 通过电子邮件发送给 EricLaw,他能够在调试 IE 时重现该问题,但还没有解决方案。赏金即将到期...
【问题讨论】:
标签: asp.net internet-explorer pdf https fiddler