我被要求实施安全要求,指示浏览器不要缓存敏感数据。使用标准指令对ASPX内容都很好:
Response.Expires = -1;
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
然而,当我为PDF下载设置这些标题时,IE8将不显示PDF(还没有尝试过其他IE版本,有点没事,我需要它在所有这些上工作,甚至IEfreaking6)。似乎在firefox 4 beta中工作,但我没有仔细检查它肯定没有缓存它。以下是我用于提供PDF的代码的删节版本:
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.Buffer = true;
//This stops the PDFs from being viewed :(
//Response.Expires = -1;
//Response.Cache.SetCacheability(HttpCacheability.NoCache);
//Response.Cache.SetNoStore();
Response.ContentType = mime;
Response.AddHeader("Content-Disposition", disposition);
Response.BinaryWrite(file);
Response.End();
在PDF的情况下,mime类型设置为:
private const string mimeTypePDF = "application/pdf";
处置设置为:
var disposition = String.Format("{0};filename=\"{1}\"", SendInline ? "inline" : "attachment", Path.GetFileName(filename));
我打算多玩一些,可能会强迫他们下载,因为mimetype“application / octet-stream”可能会起作用,但这会阻止在新的浏览器窗口中打开好的PDF文件。
是否有人阻止IE从服务器端缓存PDF并成功显示它们?
只是为了说明发生了什么。在一种情况下,用户可以从列表中选择一堆报告,这些报告被编译成PDF,PDF将显示在新的浏览器窗口中。启用缓存后,浏览器窗口将打开,但仍然是空白。
答案 0 :(得分:2)
几年前我遇到了与IE相同的问题,因为我没有要求禁止它,所以让它缓存。
但是,由于用户可以在浏览器显示后立即保存PDF文档,因此您打算如何防止他们这样做?
这不会解决您的问题,但在发送物理文件时,您应该使用Response.TransmitFile而不是BinaryWrite。它在内存利用率方面更快,更高效,因为在发送之前不需要将整个文件加载到内存中。
答案 1 :(得分:1)
看起来这个问题已在IE9中得到解决。
我现在可以成功执行以下操作:
Response.Expires = -1
Response.Cache.SetNoStore()
Response.AppendHeader("Pragma", "no-cache")
Response.ContentType = "application/pdf"
Response.BinaryWrite(myByteBuffer)
Response.Flush()
Response.Close()
享受!
答案 2 :(得分:0)
我要说它目前还不可能,我尝试的任何东西似乎都没有让它发挥作用。尝试让客户使用firefox代替! :)
答案 3 :(得分:0)
我也相信这是Internet Explorer中的一个错误。我将cache-control
标题设置为no-cache
并遇到同样的问题。另请注意,在“Internet选项”中>高级>安全性有一个'不要将加密的页面保存到磁盘'选项可能会影响它。
从响应中删除cache-control
标头解决了我的问题。然后我也尝试检查上面提到的选项,它似乎对我来说更好。它不是将PDF存储在%LocalAppData%\Microsoft\Windows\Temporary Internet Files
中,它实际上导致IE8发出一个对话框,允许我选择保存它的位置(这实际上就是我想要的)。
答案 4 :(得分:0)
使用no-cache标头在浏览器中显示pdf(和其他文档类型)的问题已作为错误提交给Microsoft:http://support.microsoft.com/kb/316431。当您尝试在这种情况下打开文档时,IE会尝试从缓存中读取它,但它不存在。
不幸的是,M $的人说这“按设计工作”,用户不应该使用no-cache标头......去图。