0

我有一个从数据库返回图像的控制器操作。这些图像是静态的,它们永远不会改变,只有当它们“改变”时,才会为图像元素分配一个新的 ID。

我分配了一个

[OutputCache(CacheProfile = "ProductImages", Duration = 36000000)]

对行动,

<add name="ProductImages" enabled="true" duration="600000" varyByCustom="ProductImages" varyByParam="" />

在 web.config->system.web->caching->outputcacheSettings->outputCacheProfiles 和

<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="365.00:00:00" />

在 system.webserver->staticContent 下。

我构建它,刷新页面,获取图像。我再次刷新页面,图像是从缓存中获取的。但是,当我更改一行代码时,重新构建,再次刷新......所有图像都会从数据库中重新获取。不仅有成千上万的图像存储在数据库中,而且还将部署在 Windows Azure 中,因此优化非常重要。

请注意,标准的“静态内容”仍然被缓存,例如 Site.css 和 JQuery.js。然而,没有什么是图像。

图片访问 URL 始终是静态的,格式为 ~/Media/Image/1a00d817-6525-4d13-82bc-d0f24d26f29c

我不知道如何解决这个问题,因为虽然它在开发过程中是可以容忍的,但如果每次我重新部署到 Azure,每个人的图像缓存都会被重置......颤抖

欢迎提出想法!

编辑:

我还尝试在 URL 的末尾添加扩展名(如 .jpg),因此浏览器会将其视为静态内容,并添加了

<add extension=".jpg" policy="CacheForTimePeriod" kernelCachePolicy="CacheForTimePeriod" location="Client" duration="365.00:00:00"/>

到 system.webserver->caching->profiles,但无济于事。

启用了达林建议的标题(总是重新请求):

Cache-Control:private, max-age=600000
Content-Length:4593
Content-Type:image/jpeg
Date:Tue, 19 Feb 2013 08:55:27 GMT
Expires:Tue, 26 Feb 2013 07:35:26 GMT
Last-Modified:Tue, 19 Feb 2013 08:55:26 GMT
Server:Microsoft-IIS/8.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET

带有 location="Any" 的标头(仅在重建时重新请求):

Cache-Control:public, max-age=600000
Content-Length:21461
Content-Type:image/jpeg
Date:Tue, 19 Feb 2013 08:57:03 GMT
Expires:Tue, 26 Feb 2013 07:37:03 GMT
Last-Modified:Tue, 19 Feb 2013 08:57:03 GMT
Server:Microsoft-IIS/8.0
Vary:*
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:4.0
X-Powered-By:ASP.NET
4

1 回答 1

0

您可以将它们缓存在客户端上,以避免每次都访问服务器:

<add 
    name="ProductImages" 
    enabled="true" 
    duration="600000" 
    varyByCustom="ProductImages" 
    varyByParam="" 
    location="Client" 
/>
于 2013-02-19T08:18:58.697 回答