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

时间:2009-06-24 14:26:01

标签: internet-explorer pdf internet-explorer-8 https 64-bit

我有一个自制的HTTPS服务器,可以提供简单的文件(它嵌入在我的应用程序中)。它很棒 - 一直在使用它。

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

我发现的问题是当我尝试通过HTTPS连接加载PDF文件时。出于某种原因,PDF从不在IE 8中显示(64位Vista上为64位)。它在Chrome中运行良好。 当使用普通HTTP时,它在IE 8中运行良好 - 仅在使用HTTPS时失败。

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

这让我觉得它是某种IE 8 / HTTPS / PDF / 64位操作系统问题,但我不确定。

IE 8的DebugBar显示请求和响应完全符合预期 - 完全没有错误。 IE 8没有显示任何错误或任何内容 - 纯白屏(或我尝试加载PDF之前显示的页面)。清除缓存/ cookie /等。

IE / PDF / HTTPS是否存在任何已知问题?

8 个答案:

答案 0 :(得分:39)

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

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

我遵循了EricLaw的建议并设置:

Cache-Control: private 

我还发现我已移除了Pragma: no-cache

现在就像魅力一样:)

答案 1 :(得分:10)

我遇到了同样的问题,只能通过要求用户修改其安全设置以关闭互联网的“高级”选项卡中的不将加密的页面保存到磁盘来使其工作选项对话框: http://support.microsoft.com/kb/812935

...然后立即恐慌,我开始查看代码(使用VB的ASP.NET)。我使用了fiddler,发现即使我没有指定缓存控制头,它似乎也在为我自动指定no-store。解决问题的关键实际上是this PHP question。通过将缓存控制头设置为 max-age = 1 ,文件将被缓存1秒,足以让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()                                

更新:我认为它有效,但我想我说的太快了。我创建了一个new question来完成这个问题。

答案 2 :(得分:10)

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

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

这不需要更改浏览器中的设置。

答案 3 :(得分:4)

我在IE8和https方面遇到了类似的问题。当我尝试将pdf流式传输到新窗口时,我得到了一个空白的html页面(它在FireFox中工作,如果不是通过https)。在经过大量搜索并尝试响应标头的不同变体后,我的解决方案是设置:

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

这会在打开之前下载整个pdf,如果它是一个非常大的pdf,则用户不太友好。但就我而言,大多数pdf只有几页。希望这可以帮助别人。

答案 4 :(得分:3)

我在你的问题中没有看到任何对.NET的引用,但我将提供一个相关的解决方案。希望您可以从中获取所需内容,而开发人员假设您的问题与.NET相关也可能会在其中找到价值。

以下是我之前使用的方法,通过HTTPS呈现浏览器内的PDF,而不需要**缓存。

    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();
    }

**发生伪缓存,只需足够长的时间让Adobe Reader加载PDF文件。我找了一个描述我正在谈论的内容的参考文献,random forum thread是我能做的最好的:

  

IE存储PDF   分配'易变'记忆和地方   %system%Temp中的指针。这是   文件存储的唯一位置。该   指针被删除并分配   Adobe尽快释放内存   读者已关闭。

我无法保证其技术准确性,但它确实反映了我使用上述方法观察到的内容。事实上,我认为该文件在Adobe Reader(在浏览器中)加载完毕后就会消失。

答案 5 :(得分:0)

您是否在Vista 64上运行32位或64位版本的IE?它配有两者。大多数情况下使用32位版本,因为没有多少插件支持64位。

我会检查两者之间是否存在差异。如果它在Vista 64上的IE 8 32位工作,那么它可能是64位版本的浏览器助手对象(BHO)的问题。

另外,如果其他浏览器以32位模式运行,请检查(通过任务管理器在进程名称后出现'* 32')。

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

答案 6 :(得分:0)

作为用户,我在从Schwab.com加载pdf文件时遇到了同样的问题。在“Internet选项”对话框的“高级”选项卡中“关闭不将加密页面保存到磁盘”的建议:http://support.microsoft.com/kb/812935“对我有用。

答案 7 :(得分:0)

我的解决方案(我们花了几天时间使用标题来实现这一点):

            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);
            }

希望能帮到某人