2009-11-26 3 views
5

У меня вопрос, связанный с методами недействительности кэша ... Я пытаюсь реализовать механизм для своего сайта, что автоматически отменяет кеш браузера (css, images ...). Я хочу иметь возможность программно аннулировать кеш браузера, когда я обновляю веб-сайт (меняю изображения или стили);ASP.NET - Недействительный кеш браузера

Например: для текущей версии, среди прочих, css и некоторые изображения были изменены. В этой ситуации я хочу, чтобы после завершения обновления, когда пользователь выполняет запрос на веб-сайт, кеш браузера автоматически становится недействительным, что заставляет повторно загружать новые изображения и стили. Это должно быть сделано только для первого запроса клиента ... из кеша должны быть извлечены следующие данные (поэтому вопрос о прагме без кэша не может быть и речи).

Вот что я пробовал: в BeginRequest обработчик событий, я добавил следующие строки: Response.Cache.SetCacheability (HttpCacheability.ServerAndPrivate); Response.Cache.SetETag ("\" e111293b17594f1487d136ea7e9314ac \ "");

это устанавливает ETag в заголовках ответов. Я полагал, что если я изменю этот ETag в каждой версии и задал его при каждом запросе, кеш будет признан недействительным, но, похоже, это не так. Я использовал Live HTTP-заголовки, чтобы увидеть результаты, и ETAG правильно настроен для ответа, но css и изображения все еще взяты из кеша ....

Любые идеи о том, как я мог бы это сделать, или если это может быть достигнуто вообще?

Заранее благодарен!

ответ

5

Я столкнулся с такими проблемами в прошлом. К сожалению, я не мог найти действительно хороший способ сделать это, поэтому мне пришлось придумать обходной путь. Я только дело с этим вопросом для CSS-файлов, так что я добавил дополнительный параметр строки запроса для каждой ссылки CSS, например

<link rel="stylesheet" type="text/css" 
     href="default.css?buildnumber=<%= Buildnumber %>" /> 

Номер сборки получает приращение с каждым выпуском, чтобы браузер был вынужден идти искать этот новый файл. Не идеальное решение, но оно работало без сучка и задоринки.

+0

Это хорошая идея, но как насчет изображений ... не так-то просто разместить параметр запроса для каждой репликации изображения в проекте ... спасибо за ответ – GeoXYZ

+0

Это все равно должно работать для изображений. Возможно, если все ваши изображения являются элементами управления сервером, вы можете переопределить событие страницы, возможно, onrender и найти все изображения и добавить дополнительный параметр URL – Bob

+0

. Да, я знаю, что могу это сделать, но это не очень хорошая практика ... сначала из все, думаю, что я должен был бы сделать это на всех страницах с изображениями на них (потому что не только главная страница имеет изображения, но и пользовательские элементы управления также имеют изображения внутри); во-вторых, чтобы автоматизировать этот процесс (не нужно адаптировать код всякий раз, когда я добавляю еще один элемент управления изображением на странице), мне придется перебирать элементы управления страницей и находить только элементы управления изображением и изменять свойство imageurl. и это очень трудоемко, особенно если количество попаданий для этого элемента управления велико, что приводит к хиту производительности. – GeoXYZ

Смежные вопросы