让 ASP.NET / IIS 不缓存 PDF 文件的正确方法

Posted

技术标签:

【中文标题】让 ASP.NET / IIS 不缓存 PDF 文件的正确方法【英文标题】:Right way to have ASP.NET / IIS NOT cache PDF files 【发布时间】:2012-01-04 05:48:45 【问题描述】:

我有以下情况,我想就处理这种情况的最佳方法提出建议。我的网络应用程序(ASP.NET 2.0 / IIS 6)生成 PDF 文件,我有一个结果页面,其中包含指向这些 PDF 的链接。

现在,我注意到如果我访问结果页面,单击 PDF 文件(它会在新窗口中打开),然后重新生成 PDF 文件,然后单击结果页面中的相同链接,即 OLD显示的是 PDF,而不是新的。我必须删除临时 Internet 文件才能看到新文件。

所以,由于我没有提供实际写入 PDF 的 ASPX(并且我不希望显示“保存”对话框),而是直接链接到 PDF 文件,所以我想知道确保用户总是看到服务器中的最新文件,而不是缓存版本。

我猜想添加无缓存标头是不可能的。但是 PDF 请求仍然会通过 HTTP 处理程序,所以我想知道我是否应该创建一个特定的 HTTP 处理程序来拦截 PDF 请求,或者我是否应该在 IIS 级别执行此操作......但是我不一定希望避免在该站点上缓存所有 PDF。

有什么建议吗?提前感谢您的帮助。

【问题讨论】:

这是一个众所周知的 Adob​​e Acrobat Reader 和 Internet Explorer 问题。即使添加了标头,IE插件仍然会缓存它.. 不知道这是一个已知问题 Michiel,感谢您告诉我。由于您似乎已经熟悉该问题,您是否有任何链接到详细/确认该问题的文章?对于问题中可用的链接,可能对有类似问题的人有用。 我用一个为我的 PDF 文件提供服务的 aspx 页面解决了这个问题 【参考方案1】:

如果您指向 pdf 文档的链接附加了唯一的查询字符串,我相信这会阻止缓存。刻度时间是一个很好的使用方法,例如:

string.Format("0?t=1", pdfFileUrl, DateTime.Now.Ticks);

【讨论】:

嘿,尼尔,没用。显然,添加随机查询字符串适用于 ASP/ASPX 文件,但不适用于 PDF 文件。我收到 400 错误的请求响应。还有其他想法吗? 我很确定它适用于任何事情。在此示例中davidwalsh.name/prevent-cache 他们将它与 css 和 javascript 一起使用 - 一种静态资源,如 pdf 文件。您生成的 PDF 文件是否存在于磁盘上,还是使用处理程序提供的? 它们存在于磁盘上。让我看看你建议的文章,我也会在一个简单的 IIS 站点上做一个 PoC,请求一个简单的 PDF,看看它是否可以这样工作。 我的错。这给我一个 Bad Request IIS 错误的原因是文件名在文件名中有一个&符号。一旦我尝试使用不同的文件名,它就可以正常工作。【参考方案2】:

我刚刚遇到了类似的问题。我的页面允许用户输入数据并生成新的 pdf 文件单击保存。新的 pdf 文件覆盖旧的。在 IE8 中,当用户点击保存后的 pdf 链接时,旧的 pdf 会一直显示(用户需要清除缓存才能显示新的)。 经过数小时的搜索,我发现在 IIS6 中,转到“输出缓存”,添加文件扩展名为“.aspx”的新缓存规则,勾选“用户模式缓存”和“内核模式缓存”,然后在两个选项下,选择“阻止所有缓存”。这对我有用!

【讨论】:

【参考方案3】:

清除临时 Internet 文件为您提供新版本的事实表明浏览器是缓存的来源。您可以关闭 iis 缓存,但这不会阻止代理缓存文档。如果您需要 100% 确定用户看到的是最新版本,我建议使用查询字符串值来导致 url 不同。查询字符串可以是 pdf 生成时间戳

【讨论】:

以上是关于让 ASP.NET / IIS 不缓存 PDF 文件的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 和实体框架:PDF 报告不在本地 iis 服务器上呈现

Asp.net 缓存在 IIS 上不起作用。 IIS上有没有设置

ASP.NET 输出缓存在 IIS7.5 上不起作用

ASP.NET 应用程序转到 500.21 ...直到 IIS 重置 + 清除临时 ASP.NET 缓存

asp.net 创建虚拟目录 iis创建虚拟目录

解决NopCommerce 在iis缓存目录Temporary ASP.NET Files下存在两个版本的dll问题