Expire Output Cache ASP.Net MVC - PullRequest
       9

Expire Output Cache ASP.Net MVC

14 голосов
/ 18 декабря 2008

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

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

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

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

Ответы [ 4 ]

16 голосов
/ 28 января 2009

Будьте осторожны при использовании «Нет» против «».

  • Если вы отправите "", то HttpHeader для Vary будет не отправлено.
  • Если вы отправляете «Нет», то отправляется HttpHeader для Vary .

Я использовал Fiddler , чтобы проверить это поведение.

Похоже, это влияет на то, возвращается ли браузер на сервер, чтобы проверить наличие последней версии (вызывая 304). По крайней мере, в Chrome это так. Вы хотите использовать Varies="", если точно знаете, что не хотите обновлять файл до истечения срока его действия.

Я бы порекомендовал использовать Varies="", как я делал в в этом посте . Для моего файла javascript я не хочу, чтобы браузер возвращался и делал еще один Http-запрос до истечения срока его действия. 304 не нужен.

14 голосов
/ 18 декабря 2008

HttpResponse.RemoveOutputCacheItem(), вероятно, метод, который вы хотите использовать. Если вы можете выяснить, под каким именем действия кэшируются, вы можете удалить только определенное действие (попробуйте установить точку останова или вывести на экран все имена кэшированных элементов)

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

6 голосов
/ 14 августа 2010

Не зная разницы между «Нет» и «» для 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 отправляет запросы независимо. Использование заголовка var: * может отключить все клиентское кеширование (http://msdn2.microsoft.com/en-us/library/system.web.httpcachepolicy.setomitvarystar.aspx).

Единственный способ удалить заголовок var: * и, следовательно, разрешить кэширование клиента, был через код:

1 голос
/ 18 декабря 2008

похоже, что кэш вывода ничего не помещает в HttpContent.Cache, потому что когда я перебираю его, коллекция пуста:

For Each elem As DictionaryEntry In HttpContext.Cache
  HttpContext.Cache.Remove(elem.Key)
Next

Вот мой атрибут действия:

<OutputCache(Duration:=600, VaryByParam:="pagename")> _
Function Index(ByVal pagename As String) As ActionResult
...