2013-02-19 87 views
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总是静态的,由 〜/媒体/图像/ 1a00d817-6525-4d13-82bc-d0f24d26f29c的形式去

我不知道如何去修复,因为虽然它如果每次重新部署到Azure时,每个人的图像缓存都会被重置... 发抖

想法是欢迎的!

编辑:

我也尝试添加的扩展URL(如.jpg)的结束,所以浏览器会认为它是静态的内容,并增加了一个

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

到system.webserver->缓存 - >配置文件,但无济于事。

页眉启用达林的建议(随时重新申请):

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 

页眉与位置= “任何”(重新申请时只重建):

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 

回答

0

你可以缓存它们在客户端避免每次点击服务器:

<add 
    name="ProductImages" 
    enabled="true" 
    duration="600000" 
    varyByCustom="ProductImages" 
    varyByParam="" 
    location="Client" 
/> 
+0

指定客户端作为位置使他们每次都要求它,足够有趣,所以这是行不通的:/ – NeroS 2013-02-19 08:23:34

+0

你似乎在使用一些'varyByCustom'方法。也许有问题。你提到缓存应该因图像ID而异,所以我猜你的控制器动作需要一个'imageId'参数。然后,你可以设置'varyByParam =“imageId”'并摆脱'varyByCustom'方法。 – 2013-02-19 08:24:22

+0

该操作所需的参数确实被称为“id”,但即使我删除了varyByCustom并将varyByParam =“id”也同样发生,但它在刷新时仍会收到请求。只有“任何”的作品,直到我重建项目。我没有在实际的IIS服务器上试过它,只是VS开发的一个,也许这可能是一个问题......但是再一次,它是浏览器缓存。我甚至不希望它再次请求图像,如果它已经将它们放入缓存中。 – NeroS 2013-02-19 08:30:26