Asp.net IE不显示禁用缓存的PDF

Asp.net IE不显示禁用缓存的PDF,asp.net,iis,Asp.net,Iis,我被要求实现一个安全要求,即我们指示浏览器不要缓存敏感数据。对于使用标准说明的ASPX内容,这一切都很好: Response.Expires = -1; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Cache.SetNoStore(); 然而,当我为PDF下载设置这些标题时,IE8将不会显示PDF(还没有尝试过其他IE版本,有点毫无意义,我需要它在所有版本上

我被要求实现一个安全要求,即我们指示浏览器不要缓存敏感数据。对于使用标准说明的ASPX内容,这一切都很好:

        Response.Expires = -1;
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore();
然而,当我为PDF下载设置这些标题时,IE8将不会显示PDF(还没有尝试过其他IE版本,有点毫无意义,我需要它在所有版本上工作,甚至IE6)。似乎在Firefox4测试版中工作,但我没有仔细检查它是否绝对没有缓存它。以下是我用来为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));
处置设置为:

       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显示在新的浏览器窗口中。启用缓存后,浏览器窗口将打开,但仍然是空白。

几年前,我在IE上遇到过同样的问题,因为我没有要求禁用缓存

但是,既然用户可以在浏览器显示PDF文档后自由保存该文档,您打算如何防止他们这样做


这并不能解决您的问题,但在发送物理文件时,您应该使用Response.TransmitFile而不是BinaryWrite。它在内存利用率方面更快、更高效,因为在发送之前不需要在内存中加载整个文件。

我要说的是,目前还不可能,我尝试过的任何方法似乎都无法让它正常工作。尝试让您的客户改用firefox!:)

我还认为这是Internet Explorer中的一个bug。我将
缓存控制
标题设置为
无缓存
,并且遇到了相同的问题。还请注意,在Internet选项>高级>安全性中,有一个“不要将加密页面保存到磁盘”选项可能会影响它


从响应中删除
缓存控制
标题解决了我的问题。然后我也试着检查上面提到的选项,它似乎对我更有效。它没有将PDF存储在
%LocalAppData%\Microsoft\Windows\Temporary Internet Files
中,而是导致IE8发出一个对话框,允许我选择保存它的位置(这实际上是我想要的)。

看起来这个问题已经在IE9中得到了解决

我现在可以成功执行以下操作:

    Response.Expires = -1
    Response.Cache.SetNoStore()
    Response.AppendHeader("Pragma", "no-cache")
    Response.ContentType = "application/pdf"
    Response.BinaryWrite(myByteBuffer)
    Response.Flush()
    Response.Close()
享受吧

使用无缓存头在浏览器中显示pdf(和其他文档类型)的问题已作为一个错误提交给Microsoft:。在这种情况下,当您尝试打开文档时,IE尝试从缓存中读取文档,但它不在缓存中


不幸的是,M$的人说这“按设计工作”,用户不应该使用无缓存头。。。想想看。

如果他们把它保存在一个不安全的地方,那么官方认为这不是我们的问题。安全需求不是我发明的,我只是需要实现它们。在这种情况下没有物理文件,PDF是动态生成的,它只是一个字节数组。好吧,这不清楚,因为您正在从内容处置行中的文件路径提取名称,并且您有一个名为“file”的文件,所以我想我应该添加两个位:)。我上一次处理PDF文档和IE是在几年前(IE 6),该系统仍在使用中,但我没有回到代码的那一部分尝试修复它。只是觉得你应该知道你不是唯一一个有这个问题的人:)。这确实是他们ActiveX控件中的Adobe错误。你检查过他们的网站了吗?我没有检查,我会检查的!您可以在客户端修复它,因为我们通过HTTPS提供服务,IE中有一个设置“不存储加密文档”,如果启用该设置,则会达到预期效果。如果滑轮和杠杆的神奇组合被触发,这似乎是可能的。使用Adobe,这就是黑魔法。他们的产品中有所有这些从未被关注过的bug。我已经记录了各种产品的bug,这些产品在过去5个版本中已被转移到下一个版本:)在使用https时,您是否确实查看了缓存的文档?缓存中是否有文档?您可能希望尝试其他缓存设置(不太严格)以查看文档实际显示的时间点,或者从缓存开始慢慢缩减,以查看文档何时停止显示。这是我很久以前想做但不需要做的事我没有做。还看到: