我的应用程序出现问题,该问题似乎是由 Chrome 的 Adobe 插件中的缺陷引起的。从 URL 访问 PDF 时,Adobe 插件将多次请求 PDF。在不相关的第三方服务器上托管的 PDF 证实了此行为,例如:
https://css4.pub/2015/icelandic/dictionary.pdf
我还确认,禁用 Adobe 并使用 Chrome 内置的 PDF 阅读器会导致仅请求一次 PDF 的所需行为。
这对于我的应用程序来说是一个巨大的问题,因为我们会即时生成 PDF,因此 Chrome 上的 Adobe 中的这种行为将导致用户访问 PDF 时多次重新生成。
我研究了可能的解决方案,包括一些旧的 stackoverflow 文章:
Chrome 在下载 PDF 时发送两个请求(并取消其中一个) 为什么 chrome 对 pdf 文件执行 2 次请求
但是有关操作标头(特别是 Accept-Range、Max-age)的任何可能解决方案都无法解决该问题。
唯一有效的解决方法是设置响应标头 Content-Disposition: Attachment,这会导致浏览器仅下载文件。然而,这不是理想的行为。
有没有什么办法,通过标头或其他服务器端工作,让 Adobe 仅请求一次文档?
还尝试了多种解决方案,我通过在响应中添加
CacheControl
标头值成功获得了一个可行的解决方案。
response.Headers.CacheControl = new CacheControlHeaderValue
{
MaxAge = TimeSpan.FromMinutes(1),
};
我们的问题与您的问题略有不同;我们使用一次性令牌来检索 PDF,因此在处理第一个请求后,带有令牌的 URL 无法再次使用。
缓存行为使初始响应能够被缓存并由后续请求(1 分钟内)重用。
这在一定程度上适用于我们的用例。 PDF 最终被渲染,但不是在 adobe 插件中,这很好。
但是我们仍然看到多个请求到达服务器,但它不再阻止 PDF 显示。