Кешът на браузъра се нулира при повторно изграждане

Имам действие на контролера, което връща изображения от база данни. Тези изображения са статични, те никога няма да се променят и единственият път, когато се „променят“, е когато на елемента на изображението бъде присвоен нов идентификатор.

Назначих a

[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, но без резултат.

Заглавки с активирани предложения на darin (винаги повторно заявяване):

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

person NeroS    schedule 19.02.2013    source източник


Отговори (1)


Можете да ги кеширате на клиента, за да избегнете удряне на сървъра всеки път:

<add 
    name="ProductImages" 
    enabled="true" 
    duration="600000" 
    varyByCustom="ProductImages" 
    varyByParam="" 
    location="Client" 
/>
person Darin Dimitrov    schedule 19.02.2013
comment
Посочването на клиент като местоположение ги кара да го изискват всеки път, достатъчно смешно, така че това не работи :/ - person NeroS; 19.02.2013
comment
Изглежда, че използвате някакъв varyByCustom метод. Може би там е проблемът. Споменахте, че кешът трябва да варира в зависимост от идентификатора на изображението, така че предполагам, че вашето действие на контролера приема imageId параметър. След това можете да зададете varyByParam="imageId" и да се отървете от метода varyByCustom. - person Darin Dimitrov; 19.02.2013
comment
Параметърът, който предприема действието, наистина се нарича id, но дори и да премахна varyByCustom и да поставя varyByParam=id, същото се случва, продължава да се изисква при опресняване. Само Any работи и само докато не възстановя проекта. Не съм го пробвал на действителен IIS сървър, само на този за разработка на VS, може би това може да е проблем... но от друга страна, това е кеша на браузъра. Дори не искам никога да иска изображенията отново, ако вече ги има в кеша. - person NeroS; 19.02.2013
comment
Можете ли да покажете заглавките на HTTP отговора, които сървърът връща, когато за първи път заявите изображението? - person Darin Dimitrov; 19.02.2013
comment
Свършен. Също така добавени всякакви заглавки. - person NeroS; 19.02.2013
comment
Обърнете внимание, че само когато използвам F5, ги изисква повторно. Нормалната навигация ги извлича от кеша с отговор 200, дори след възстановяване. Това, което искам обаче, е винаги да са кеширани, дори и с опресняване. - person NeroS; 19.02.2013
comment
Освен това това е в хром. Firefox отказва изцяло да кешира, когато опреснявам, независимо от настройките. - person NeroS; 19.02.2013
comment
За съжаление не мога да възпроизведа този проблем. Това работи добре за мен. - person Darin Dimitrov; 19.02.2013