我在 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 OK
缓存控制:max-age=1
日期:2009 年 7 月 29 日星期三 17:57:58 GMT
内容类型:应用程序/pdf
服务器:Microsoft-IIS/6.0
MicrosoftOfficeWebServer:5.0_Pub
X-Powered-By :ASP.NET
X-AspNet-Version: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”。到目前为止没有任何帮助。有一些 Microsoft 知识库 文章,所有这些都表明Cache-Control: no-cache是罪魁祸首。还有其他想法吗?
更新:顺便说一下,为了完整起见,Excel 和 Word 输出也会出现同样的问题。
更新:没有取得任何进展。我将 .SAZ 文件从 Fiddler 通过电子邮件发送给 EricLaw,他能够在调试 IE 时重现该问题,但还没有解决方案。赏金即将到期...