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