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

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

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

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

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

14.08.2008 19:39:32
8 ОТВЕТОВ

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

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

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

1
14.08.2008 19:51:50

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

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

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

Cache.Remove(key);

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

1
14.08.2008 19:55:31
РЕШЕНИЕ

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

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
48
14.08.2008 20:04:36
Кто-нибудь знает, если что-то подобное доступно для классического ASP?
Brettski 22.09.2008 15:50:28
Я не думаю, что кэширование было доступно в ASP, поэтому не извините.
GateKiller 8.12.2010 16:04:46
Это очищает все кэши для каждого для каждого параметра для этой страницы.
Salim 26.11.2015 10:55:16
Я использую MVC 5.2.3, где я должен написать этот код?
Mohammad Dayyan 12.01.2016 08:23:56
Я использую пользовательский веб-элемент управления для динамических меню, я использую выходной кэш и хочу удалить кэш при выходе из системы, я использовал ваше решение и передал путь к своему пользовательскому элементу управления, но у меня не работал.
Neha Thakur 17.12.2016 10:41:46

Использование 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.

5
6.01.2009 13:55:03
Отлично, это то, что я ищу. Есть только одна вещь, которую вы должны изменить. HttpContext.Current.Cache.Remove (cacheKey);
Salim 26.11.2015 10:58:41

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

sqlcachedependency msdn

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

1
2.01.2010 00:17:48

Вышесказанное хорошо, если вы знаете, для каких страниц вы хотите очистить кеш. В моем случае (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);

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

40
20.05.2010 18:24:31
Ir работает только для кэширования всей страницы. Это не работает для действий ребенка. Какие-либо предложения?
Andrei M 19.08.2011 06:40:40
and.maz ты это понял?
bobek 6.12.2012 16:08:15
@ and.maz В случае , если вы поняли, как сделать это для ребенка действий, есть баунти здесь .
marapet 25.03.2013 16:33:48
Это не сработало для меня. Эта неспособность очистить элементы кэша кажется одним огромным недостатком в MVC
Dave Lawrence 25.06.2013 15:43:08
Возможно, вы не можете очистить кэш, потому что вы используете @ Html.Action () для визуализации частичного представления. Вам придется использовать OutputCacheAttribute.ChildActionCache = new MemoryCache("NewRandomStringNameToClearTheCache");для очистки весь «дочерний кэш действий» (для всех дочерних действий - кажется, нет лучшего подхода без использования библиотеки). dotnet.dzone.com/articles/programmatics-clearing-0
user2173353 10.12.2013 16:46:39

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

-1
2.11.2012 09:38:05
Я подозреваю, что это закрывает процесс приложения ASP.NET на IIS. Это кажется немного чрезмерным, возможно, очистит все кеши и приведет к значительным проблемам с производительностью на больших сайтах.
GateKiller 11.02.2011 12:24:54

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

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

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

Session.Abandon();
Session.Clear();
3
22.06.2011 13:16:14