Подтвердить что ты не робот

Истечение срока действия кэша вывода ASP.Net MVC

Я использую стандартный тег outputcache в моем приложении MVC, который отлично работает, но мне нужно заставить его быть сброшенным в определенное время. Как мне это достичь? Страница, которая кэшируется, построена из очень простого маршрута {Controller}/{PageName} - поэтому большинство страниц выглядят примерно так:/Pages/About-Us

Вот тег выходного кэша, который находится в верхней части моей страницы просмотра .aspx, чтобы быть ясным:

<@ OutputCache Duration="100" VaryByParam="None" %>

Итак, в другом действии на том же контроллере, где содержимое обновляется, мне нужно сбросить этот кеш или даже все его - это очень маленькое приложение, поэтому не нужно иметь дело с большими дамами, чтобы сбрасывать все кэшированные элементы.

4b9b3361

Ответ 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