在IE 8中无法显示HTTPS中的PDF(在64位Vista上)

我有一个本土的HTTPS服务器,提供简单的文件(它embedded我的应用程序)。 它工作得很好 – 一直使用它。

最近添加的SSL支持 – Chrome,FireFox和IE都喜欢它,并加载页面就好了。

我发现的问题是当我尝试通过HTTPS连接加载PDF文件。 出于某种原因,PDF不会显示在IE 8(64位Vista上的64位)中。 它在Chrome中正常工作。 而且在使用普通HTTP的情况下,它在IE 8中工作正常 – 仅在使用HTTPS时失败。

注意:当提到IE 8时,它是64位Vista上的32位IE 8,尽pipe64位IE 8具有相同的行为。

这使我认为这是某种IE 8 / HTTPS / PDF / 64位操作系统的问题,但我不确定。

IE 8的DebugBar显示请求和响应完全按照预期进行 – 完全没有错误。 IE 8不显示任何错误或任何东西 – 纯白色的屏幕(或我试图加载PDF之前显示的页面)。 清除caching/ cookies /等。

IE / PDF / HTTPS有任何已知的问题吗?

以为我会回来,给出最后的答案。

感谢所有build议“不要将encryption的页面保存到磁盘”的人。

我遵循EricLaw的build议并设定:

Cache-Control: private 

我也发现我有Pragma: no-cache ,我删除了它。

就像现在的魅力:)

我遇到了同样的问题,只能通过要求用户修改其安全设置,以closures在Internet选项对话框的高级选项卡中不要将encryption的页面保存到磁盘 : http : //support.microsoft的.com / KB / 812935

…然后立即恐慌了,我开始看代码(使用VB的ASP.NET)。 我用fiddler,发现即使没有指定caching控制头,框架似乎也自动为我指定了no-store。 解决这个问题的关键在于这个PHP问题 。 通过将caching控制标题设置为max-age = 1 ,文件将被caching1秒,只要Adobe Reader能够从磁盘中提取文件并将其加载到内存中即可。 我更新了我们的代码来生成PDF,如下所示:

 Response.ClearContent() Response.ClearHeaders() Response.AddHeader("cache-control", "max-age=1") Response.ContentType = "application/pdf" Response.AddHeader("content-disposition", "attachment; filename=whatever.pdf") Response.AddHeader("content-length", mem_stream.Length.ToString) Response.BinaryWrite(mem_stream.ToArray()) Response.Flush() Response.End() 

更新:我认为这是工作,但我想我说得太快了。 我提出了一个新的问题来解决这个问题。

 response.setHeader("Cache-Control","private"); 

在IE8和IE9中为我们做了诀窍。

这并不需要改变浏览器的设置。

我有一个与IE8和https类似的问题。 当我试图把一个pdfstream到一个新窗口时,我得到了一个空白的html页面(它在FireFox中工作,如果它不是通过https)。 经过大量的search和尝试不同的响应头的变化,我的解决scheme是设置:

Response.AppendHeader("Accept-Ranges", "none");

如果它是一个非常大的PDF文件,它将在打开之前下载整个PDF,这不太方便用户。 但在我的情况下,大多数pdf只有几页。 希望这可以帮助别人。

在你的问题中,我没有看到.NET的任何引用,但我将提供一个相关的解决scheme。 希望你能从中得到你所需要的东西,而开发者假设你的问题与.NET相关,也可能会发现它的价值。

这里有一个我以前使用的方法,通过HTTPS在浏览器中呈现PDF,而不需要**caching。

  private void RenderPdfToResponse(byte[] documentBytes) { Response.BufferOutput = true; Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Cache-control", "no-store"); Response.ContentType = "application/pdf"; Response.AddHeader("Content-Length", documentBytes.Length.ToString()); Response.BinaryWrite(documentBytes); Response.Flush(); HttpContext.Current.ApplicationInstance.CompleteRequest(); } 

**有一个伪caching发生,只是足够Adobe Reader加载PDF文件。 我寻找一个参考来描述我在说什么, 随机的论坛主题是我能做的最好的:

IE将PDF存储在已分配的“易失性”内存中,并将指针放在%system%Temp中。 这是文件存储的唯一位置。 指针被删除,一旦Adobe Readerclosures,分配的内存将被释放。

我不能保证技术的准确性,但它确实反映了我使用上述方法观察到的情况。 事实上,我认为在Adobe Reader(在浏览器中)完成加载的时候,文件就消失了。

你是否在Vista 64上运行32位或64位版本的IE? 它来与两个。 大多数时候使用32位版本,因为没有很多插件支持64位。

我会检查两者是否有区别。 如果它适用于Vista 64的IE 8 32位,那么它可能是64位版本的浏览器帮助对象(BHO)的问题。

另外,如果其他浏览器以32位模式运行,请检查以查看(通过任务pipe理器在进程名称后面存在“* 32”)。

另一件事,我会检查是否HTTPS正在导致IE8不cachingPDF文件出于某种原因(HTTPSstream量通常不caching)。 我会运行procmon来查看是否注意到正在写入文件系统的PDF文件。 可能有政策设置,你可能需要改变。 我不确定是否有另外一种方式说你有一个PDF不应该被写入磁盘,但仍然可以显示。

作为一个用户,我从加载Schwab.com的PDF文件时遇到同样的问题。 在“Internet选项”对话框的“高级”选项卡中closures“不要将encryption的页面保存到磁盘”的build议: http : //support.microsoft.com/kb/812935 “为我工作。

我的解决scheme(花了我们花了几天的时间与标题玩这个工作):

  if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer" && System.Web.HttpContext.Current.Request.Browser.Version == "8.0") { System.Web.HttpContext.Current.Response.Clear(); System.Web.HttpContext.Current.Response.ClearContent(); System.Web.HttpContext.Current.Response.ClearHeaders(); System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream"; System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public"); System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60"); System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary"); System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename); System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString()); System.Web.HttpContext.Current.Response.BinaryWrite(document.Data); } 

希望能帮助别人