Истечение срока действия кэша вывода ASP.Net MVC
Я использую стандартный тег outputcache в моем приложении MVC, который отлично работает, но мне нужно заставить его быть сброшенным в определенное время. Как мне это достичь? Страница, которая кэшируется, построена из очень простого маршрута {Controller}/{PageName} - поэтому большинство страниц выглядят примерно так:/Pages/About-Us
Вот тег выходного кэша, который находится в верхней части моей страницы просмотра .aspx, чтобы быть ясным:
<@ OutputCache Duration="100" VaryByParam="None" %>
Итак, в другом действии на том же контроллере, где содержимое обновляется, мне нужно сбросить этот кеш или даже все его - это очень маленькое приложение, поэтому не нужно иметь дело с большими дамами, чтобы сбрасывать все кэшированные элементы.
Ответы
Ответ 1
Будьте осторожны с использованием "Нет" и "".
- Если вы отправляете ", то HttpHeader для Vary не отправляется.
- Если вы отправляете "Нет", тогда отправляется HttpHeader для Vary.
Я использовал Fiddler, чтобы проверить это поведение.
Это, похоже, влияет на то, вернется ли браузер к серверу, чтобы проверить последнюю версию (вызывая 304). По крайней мере, в Chrome это происходит. Вы хотите использовать Varies=""
, если вы точно знаете, что не хотите обновлять файл до истечения срока его действия.
Я бы рекомендовал использовать Varies=""
, как я сделал в этом сообщении. Для моего javascript файла я не хочу, чтобы браузер возвращался и делал еще один запрос Http до истечения срока его действия. 304 не требуется.
Ответ 2
HttpResponse.RemoveOutputCacheItem()
- это, вероятно, метод, который вы хотите использовать. Если вы можете определить, какое имя будут кэшироваться, вы можете удалить только определенное действие (попробуйте установить точку останова или сбросить все имена кешированных элементов на экран)
В противном случае я буду перебирать весь выходной кеш и просто очищать каждый элемент.
Ответ 3
Не зная разницы между "None" и "" для VaryByParam, я использовал этот атрибут:
[OutputCache(Location=OutputCacheLocation.ServerAndClient, Duration=int.MaxValue, VaryByParam="none")]
И этот код "исправить" проблему Vary: *
:
this.Response.Cache.SetOmitVaryStar(true);
Я нашел ссылку на Тесты кэширования ASP.NET обнаруживают ошибку с VaryByParam
Разница между OutputCache директива установлена на "Клиент" и "ServerAndClient" - это "ServerAndClient" выводит Vary поле. Это влияет на IE в этом IE отправляет запросы независимо. Использование заголовка разницы: * может быть отключено все кэширование клиентов (http://msdn2.microsoft.com/en-us/library/system.web.httpcachepolicy.setomitvarystar.aspx).
Единственный способ удалить переменный: * заголовок и, таким образом, разрешить кэширование клиента через код:
Ответ 4
Кажется, что выходной кеш ничего не помещает в HttpContent.Cache, потому что когда я прохожу через него, коллекция пуста:
For Each elem As DictionaryEntry In HttpContext.Cache
HttpContext.Cache.Remove(elem.Key)
Next
Вот мой атрибут action:
<OutputCache(Duration:=600, VaryByParam:="pagename")> _
Function Index(ByVal pagename As String) As ActionResult