Очистка кеша страниц в ASP.NET

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

<%@OutputCache Duration = "600" VaryByParam = "*" %>

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

Как мне это сделать в ASP.Net C#?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
0
96 896
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Хм. Вы можете указать атрибут VaryByCustom в элементе OutputCache. Его значение передается в качестве параметра методу GetVaryByCustomString, который можно реализовать в global.asax. Значение, возвращаемое этим методом, используется в качестве индекса для кэшированных элементов - например, если вы возвращаете количество комментариев на странице, каждый раз, когда добавляется комментарий, новая страница будет кэшироваться.

Предостережение заключается в том, что это фактически не очищает кеш. Если запись в блоге получает много комментариев, ваш кеш может резко увеличиться в размере с помощью этого метода.

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

Если вы измените "*" только на параметры, которые должен включать кеш (PostID?), Вы можете сделать что-то вроде этого:

//add dependency
string key = "post.aspx?id = " + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

и когда кто-то добавляет комментарий ...

Cache.Remove(key);

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

Ответ принят как подходящий

Я нашел ответ, который искал:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");

кто-нибудь знает, доступно ли что-то подобное для классического ASP?

Brettski 22.09.2008 19:50

Я не думаю, что кеширование было доступно в ASP, так что извините.

GateKiller 08.12.2010 19:04

Это очищает все кеши для каждого для всех параметров этой страницы.

Salim 26.11.2015 13:55

Я использую MVC 5.2.3, где мне писать этот код?

Mohammad Dayyan 12.01.2016 11:23

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

Neha Thakur 17.12.2016 13:41

Использование Response.AddCacheItemDependency для очистки всех кэшей вывода.

  public class Page : System.Web.UI.Page
  {
    protected override void OnLoad(EventArgs e)
    {
        try
        {
            string cacheKey = "cacheKey";
            object cache = HttpContext.Current.Cache[cacheKey];
            if (cache == null)
            {
              HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
            }

            Response.AddCacheItemDependency(cacheKey);
        }
        catch (Exception ex)
        {
            throw new SystemException(ex.Message);
        }

        base.OnLoad(e);
    }     
 }



  // Clear All OutPutCache Method    

    public void ClearAllOutPutCache()
    {
        string cacheKey = "cacheKey";
        HttpContext.Cache.Remove(cacheKey);
    }

Это также можно использовать в OutputCachedPage ASP.NET MVC.

Отлично, это то, что я ищу. Вам следует изменить только одно. HttpContext.Current.Cache.Remove (cacheKey);

Salim 26.11.2015 13:58

почему бы не использовать sqlcachedependency для таблицы сообщений?

sqlcachedependency msdn

Таким образом, вы не реализуете собственный код очистки кеша и просто обновляете кеш по мере изменения содержимого в базе данных?

Вышеупомянутое нормально, если вы знаете, для каких страниц вы хотите очистить кеш. В моем случае (ASP.NET MVC) я ссылался на одни и те же данные со всех сторон. Поэтому, когда я делал [сохранение], я хотел очистить весь кеш-сайт. Вот что у меня сработало: http://aspalliance.com/668

Это делается в контексте фильтра OnActionExecuting. Это так же легко можно сделать, переопределив OnActionExecuting в BaseController или что-то в этом роде.

HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");

Настраивать:

protected void Application_Start()
{
    HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}

Незначительная настройка: У меня есть помощник, который добавляет «флэш-сообщения» (сообщения об ошибках, сообщения об успехе - «Этот элемент был успешно сохранен» и т. д.). Чтобы избежать появления флэш-сообщения при каждом последующем GET, мне пришлось сделать недействительным после написания флэш-сообщения.

Очистка кеша:

HttpRuntime.Cache.Insert("Pages", DateTime.Now);

Надеюсь это поможет.

Ir работает только для кеширования всей страницы. Это не работает для дочерних действий. Какие-либо предложения?

Andrei M 19.08.2011 10:40

and.maz вы в этом разобрались?

bobek 06.12.2012 20:08

@ and.maz Если вы догадались, как это сделать для дочерних действий, есть награда здесь.

marapet 25.03.2013 20:33

У меня это не сработало. Невозможность очистить элементы кеша кажется огромным недостатком mvc.

Dave Lawrence 25.06.2013 19:43

Вероятно, вы не можете очистить кеш, потому что вы используете @ Html.Action () для визуализации частичного представления. Вам придется использовать OutputCacheAttribute.ChildActionCache = new MemoryCache("NewRandomStringNameToClearTheCache"); для очистки всего «кеша дочерних действий» (для всех дочерних действий - кажется, нет лучшего подхода без использования библиотеки). dotnet.dzone.com/articles/programmatically-clearing-0

user2173353 10.12.2013 20:46

@Kevin, можете ли вы объяснить, как очистить все кешированные страницы веб-сайта после выхода из системы?

Mohit Shah 04.03.2016 08:32

HttpRuntime.Close() .. Я пробую все методы, и это единственный, который у меня работает

Я подозреваю, что это закрывает процесс приложения ASP.NET в IIS. Это кажется немного чрезмерным, вероятно, очистит все кеши и вызовет значительные проблемы с производительностью на крупных веб-сайтах.

GateKiller 11.02.2011 15:24

В событии загрузки главной страницы напишите следующее:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

и в кнопке выхода нажмите:

Session.Abandon();
Session.Clear();

Другие вопросы по теме