Internet explorer Can';在IE 8中显示来自HTTPS的PDF(在64位Vista上)
我有一个自己开发的HTTPS服务器,可以提供简单的文件(它嵌入到我的应用程序中)。它工作得很好——一直在使用它 最近增加了SSL支持——Chrome、FireFox和IE都喜欢它,加载页面也很好 我发现的问题是当我试图通过HTTPS连接加载PDF文件时。由于某些原因,PDF永远不会显示在IE8中(64位Vista上的64位)。它在铬合金中工作良好。 当使用普通HTTP时,它在IE8中工作良好——只有在使用HTTPS时才会失败 注意:当提到IE8时,它是64位Vista上的32位IE8,尽管64位IE8具有相同的行为 这让我觉得这是某种IE8/HTTPS/PDF/64位操作系统的问题,但我不确定 IE8的DebugBar显示请求和响应完全按照预期进行——没有任何错误。IE8没有显示任何错误或任何东西——纯白色屏幕(或在我尝试加载PDF之前显示的页面)。已清除缓存/cookies/etcInternet explorer Can';在IE 8中显示来自HTTPS的PDF(在64位Vista上),internet-explorer,pdf,internet-explorer-8,https,64-bit,Internet Explorer,Pdf,Internet Explorer 8,Https,64 Bit,我有一个自己开发的HTTPS服务器,可以提供简单的文件(它嵌入到我的应用程序中)。它工作得很好——一直在使用它 最近增加了SSL支持——Chrome、FireFox和IE都喜欢它,加载页面也很好 我发现的问题是当我试图通过HTTPS连接加载PDF文件时。由于某些原因,PDF永远不会显示在IE8中(64位Vista上的64位)。它在铬合金中工作良好。 当使用普通HTTP时,它在IE8中工作良好——只有在使用HTTPS时才会失败 注意:当提到IE8时,它是64位Vista上的32位IE8,尽管64位
IE/PDF/HTTPS是否存在任何已知问题?您是否在Vista 64上运行32位或64位版本的IE?两者都有。大多数情况下使用32位版本,因为现在还没有多少插件支持64位 我想看看两者之间是否有区别。如果它在Vista 64上的32位IE 8中工作,则可能是64位版本的浏览器辅助对象(BHO)的问题 另外,检查其他浏览器是否以32位模式运行(通过任务管理器在进程名称后显示“*32”)
我要检查的另一件事是HTTPS是否出于某种原因导致IE8不缓存PDF文件(HTTPS流量通常不缓存)。我会跑过去看看你是否注意到一个PDF文件正在写入文件系统。您可能需要更改某些策略设置。我不确定是否有其他方式可以表示您有一个不应该写入磁盘但仍然可以显示的PDF。我在您的问题中没有看到任何对.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文件。我找了一份描述我所说内容的参考资料,a是我能做的最好的:
IE将PDF存储在
分配的“易失性”内存和位置
%system%Temp中的指针。这是
存储文件的唯一位置。这个
删除并分配指针
内存会在Adobe启动后立即释放
读卡器已关闭
我不能保证它的技术准确性,但它确实反映了我使用上述方法观察到的情况。事实上,我认为该文件在Adobe Reader(在浏览器中)中加载完毕后会立即消失。我遇到了同样的问题,只有在“Internet选项”对话框的“高级”选项卡中要求用户修改其安全设置以关闭“请勿将加密页面保存到磁盘”才能使其正常工作: …紧接着恐慌过后,我开始查看代码(使用VB的ASP.NET)。我使用了fiddler,发现即使我没有指定缓存控制头,框架似乎也会自动为我指定不存储。解决这一问题的关键实际上在于。通过将cache-control头设置为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()
最新消息:我原以为它起作用了,但我想我说得太早了。我创建了一个应用程序来解决这个问题。作为一个用户,我在从Schwab.com加载pdf文件时遇到了同样的问题。“Internet选项”对话框的“高级”选项卡中的“关闭请勿将加密页面保存到磁盘”的建议:“对我有效。我想我会回来给出最终答案 感谢所有建议“不要将加密页面保存到磁盘”的人 我听从了EricLaw的建议,设置:
Cache-Control: private
我还发现我有Pragma:no cache
,我将其删除
现在就像一个魔咒:)我在IE8和https上也有类似的问题。当我尝试将pdf流式传输到新窗口时,我得到了一个空白的html页面(它在FireFox中工作,如果不是通过https)。在大量搜索和尝试响应标题的不同变体后,我的解决方案是设置:
Response.AppendHeader(“接受范围”、“无”)代码>
这将在打开之前下载整个pdf,如果它是一个非常大的pdf,那么它的用户友好性会降低。但就我而言,大多数PDF文件只有几页。希望这能帮到别人。response.setHeader(“缓存控制”、“专用”);
在IE8和IE9中为我们表演了这个技巧
这不需要更改浏览器中的设置。我的解决方案(我们花了好几天的时间处理标题才能使其正常工作):
希望这能帮助别人给杰夫打个好电话。它实际上是64位Vista上的32位IE(有些页面包含flash,但还没有64位flash播放器)。将编辑问题…保存文件时可能存在潜在问题。我更新了我的答案。在IE中,我未选中“不将加密页保存到磁盘”。看起来.jpg、.gif、.js和.css文件正在保存,但没有.PDF或.html文件。非常奇怪。。。(虽然在这种情况下这是正确的,但似乎很难相信IE能猜到图像不包含私有信息)您为PDF发送的MIME类型/内容类型是什么?您发送的缓存控制头是什么?尝试发送Cache-Control:private而不是任何禁止缓存的指令;这肯定与缓存有关;我不会“缓存”这些数据
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);
}