我们一直在评估ImageResizer作为动态调整大小并优化存储在S3(和远程)应用程序中的图像的工具。我们已经努力确保S3文件在存储后很少被修改,并且它们具有非常积极的缓存设置。
如果我们直接从S3提供文件,那就太棒了:一旦应用程序有了图片,它就知道它几乎可以永久存放。但是一旦图像通过ImageResizer,该信息就会丢失。
在我看来,这个问题有两个部分:
首先,应用程序知道图像不会改变。我希望能够通过原始的Cache-Control
标题,也可能是原始文件的Last-Modified
日期。
如果图片的值为Last-Modified
和/或Etag
,则应用可能会在某些时候尝试条件GET。虽然服务器可能会或可能没有仍在其缓存中的映像副本,但它需要能够将这些原始值与该缓存条目相关联才能进行相应的响应。
这可以通过股票S3Reader2
和DiskCache
(和朋友)完成吗?如果我们要分叉S3Reader2
,是否有一个定义的插件机制来为响应添加标头?
答案 0 :(得分:0)
S3Reader2的库存版本可以配置为两种模式:永久缓存,以及滑动或固定窗口的缓存元数据。如果元数据到期,则检查S3以获取更新。
安装DiskCache时会提供上次修改和Etag。如果您想要进行URL重写或启用/禁用插件,那么传递这些值会导致问题,因为使用客户端无法使文件无效。我们错误地在V2中有这种行为。
缓存控制信息不会传递给客户端;通过ClientCache或IIS / web.config规则单独处理。或者通过CDN。通常,开发人员希望单独控制每个缓存阶段 - blob到服务器,服务器到CDN,CDN到客户端。
也就是说,如果您愿意修改代码,那么传递缓存控件和/或过期标头肯定是可能的。但是,如果您要缓存到磁盘,则不可能这样做,因为磁盘上保留的唯一元数据是修改/创建/访问日期。