2011-01-11 2 views
8

Я использую атрибут OutputCache в моем сайте MVC следующим образом:Обход OutputCache в ASP.NET MVC

[OutputCache(Duration = 5000, 
     VaryByParam = "name;region;model;id;op;content;featured;isStarred;page;size;")] 

Однако иногда я хотел бы обойти кэш вывода полностью и заставить выборки из базы данных. Это особенно справедливо для моей тестовой среды, где я постоянно загружаю новые данные в базу данных для тестирования.

Есть ли способ обойти кеш в этом случае?

Спасибо.

ответ

2

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

Добавил следующее к действию, в котором я хотел включить опцию «no-cache».

Response.AddCacheItemDependency("Pages"); 

И создал следующее действие, которое я могу вызвать для обновления кеша.

public ActionResult RefreshCache() 
    { 
     HttpContext.Cache.Insert("Pages", DateTime.Now, null, 
           DateTime.MaxValue, TimeSpan.Zero, 
           CacheItemPriority.NotRemovable, 
           null); 
     Logger.Info("Cleansed cache"); 
     return RedirectToAction("HubContent"); 
    } 
10

Вместо указания всех параметров выходного кэша в строке, в атрибуте можно использовать профиль OutputCache.

Профили выходного кэша позволяют поместить все ваши настройки кэша вывода в ваш web.config, дать профилю имя, а затем указать этот профиль из вашего атрибута.

Как только вы настроите эту настройку, вы можете изменить настройки в файле web.config, который вы используете для отладки, так что продолжительность кеширования составляет только 1 секунду. Очевидно, вы оставите свой файл web.config для производства с гораздо большей продолжительностью.

Для получения дополнительной информации о профилях, проверить http://msdn.microsoft.com/en-us/library/hdxfb6cy.aspx

+0

Вы не можете сделать это для частичных. –

4

Если вы хотите, чтобы отключить его можно использовать

<caching> 
    <outputCache enableOutputCache="false" /> 
</caching> 

в вашем web.config under.system.web. Если вы хотите сделать из кода (с помощью кнопки или что-то еще) вы могли бы также сделать:

System.Configuration.Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~/"); 
System.Web.Configuration.OutputCacheSection cacheSection = (System.Web.Configuration.OutputCacheSection)config.GetSection("system.web/caching/outputCache"); 
cacheSection.EnableOutputCache = true/false; 
config.Save(); 

Это вероятно работать только на вашем Dev машине. Большинство серверов настроены так, чтобы не разрешать редактирование этого раздела в файле machine.config.

+1

не будет отключать его 'enableOutputCache =" false "'? – Maslow

+0

+1 6 месяцев спустя кто-то поймал ошибку копирования и вставки –

+0

Большое спасибо за фрагмент кода - мне было очень легко изменить настройку для тестирования производительности: -D – Oliver

1

Это не точно ответить на ваш вопрос, но ответ на ваш титул (который не «как очистить элемент из кэша "): Вы можете добавить" VaryByParam «:

[OutputCache(Duration=5000,VaryByParam="YourExistingParams;CacheBypass")] 

тогда, когда у ou хотите обходить кеш, вы просто передаете параметр CacheBypass значение DateTime.UtcNow.Ticks (или любая случайная вещь) => например: http://localhost/?CacheBypass=1234567890

+0

VaryByParam также принимает подстановочный знак ('*'), чтобы вы не нужно вводить все ваши параметры. Это будет кэшировать с помощью параметра ANY. Следует использовать с осторожностью, но '[OutputCache (Duration = 5000, VaryByParam =" * ")]' – blockloop

+0

Абсолютно, но это поведение может не потребоваться (особенно если он использует отслеживание строк запроса GA). Внимание: как указано, это фактически не отвечает на вопрос (но отвечает на заголовок), потому что он не удаляет элемент из кеша, он будет единственным, кто увидит обновленную страницу. – Vincent

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