Обойти OutputCache в ASP.NET MVC - PullRequest
9 голосов
/ 11 января 2011

Я использую атрибут OutputCache на своем веб-сайте MVC следующим образом:

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

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

Могу ли я вообще обойти кеш в этом случае?

Спасибо.

Ответы [ 5 ]

10 голосов
/ 12 января 2011

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

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

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

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

4 голосов
/ 14 января 2011

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

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

в вашем файле web.config в разделе.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();

Это , вероятно , будет работать только на вашем компьютере разработчика.Большинство серверов настроены так, что не позволяют редактировать этот раздел в machine.config.

2 голосов
/ 27 января 2011

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

Добавил следующее к действию, которое я хотел включить опцией «без кэширования».

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");
    }
1 голос
/ 10 октября 2013

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

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

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

1 голос
/ 24 июля 2012

См. Следующую статью о подходе AOP к настройке OutputCache

http://www.avantprime.com/blog/21/how-to-handle-output-caching-in-the-development-environment-for-asp-net-mvc-applications

...