【问题标题】:Efficient caching of generated images in ASP.NET MVC在 ASP.NET MVC 中高效缓存生成的图像
【发布时间】:2009-11-24 10:32:28
【问题描述】:

我正在编写一个 MVC 应用程序,它提供用户上传图像的转换版本(旋转、裁剪和加水印)。一旦指定了转换,它们就不太可能改变,所以我想积极缓存生成的输出,并尽可能高效地提供它。

转换选项存储在数据库中,并由图像服务器用于按需创建图像;只有原始上传文件被永久存储。在本地目录中缓存生成的图像允许 IIS 7 在不触及 ASP.NET 进程的情况下拾取它们,即通过匹配路由。 images/ 中的静态图像优先于动态 MVC 路由 /images/{id}.jpg

此时我担心的是用户何时实际更改了转换选项——图像需要重新生成,但我想避免手动删除它们。我在数据库中存储了一个最后修改的字段,所以我可以将该时间戳附加到 URL,例如http://images.example.com/images/153453543.jpg?m=123542345453。如果缓存由 ASP.NET 进程处理,这将起作用,这可能会通过参数 m 改变输出缓存,但鉴于我需要提供大量图像,我宁愿避免这种情况。

如果满足某些条件,是否有一种智能方法让 IIS 丢弃静态文件?

【问题讨论】:

    标签: asp.net-mvc model-view-controller image


    【解决方案1】:

    如果您不希望每次有人请求图像时都调用您的 ASP.NET 代码,那么我建议您在更新转换时删除图像。这是一个相对“免费”的操作,因为它只是一个缓存,它们会在需要时重新生成。

    您可能会关心跟踪用户更新图像属性时是否实际更改了转换,以及用户更改的频率。是否需要频繁地重新生成图像是否重要?

    您可以在文件名中包含时间戳,例如

    http://images.example.com/images/153453543_20091124120059.jpg. 
    

    这样您可以避免在更新时删除图像。但是,您会留下旧文件的痕迹...

    【讨论】:

    • 我很可能最终不得不在更新数据库行时删除缓存文件,但我仍然希望将这两个问题分开;我的“愚蠢”图像选项模型不需要知道我的缓存机制。至于留下旧图像的痕迹,那将是一个大问题。此外,图片选项实际上在图片上传后就发生了相当大的变化,因为这些更改是增量提交的(通过 ajax)。
    • 为什么不向您的图像选项模型添加 OnTransformationUpdate 事件?然后您的缓存解决方案可以挂钩事件并删除相应的缓存图像。
    • ebrown:缓存解决方案在不同的服务器上运行,而处理上传图像和更新数据库中的选项的 Web 服务器混合运行 ASP 经典和 ASP.NET -- 和在架构上是不健全的。我想将这些部分分开。
    【解决方案2】:

    为什么不在这些设置发生更改时运行该进程来生成物理图像,而不是在每次请求时运行?

    【讨论】:

    • 我想让我的图片上传代码尽可能简单。它应该只是将图像推送到图像服务器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 2011-12-18
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多