Очистка кеша страниц в ASP.NET - PullRequest
50 голосов
/ 14 августа 2008

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

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

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

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

Ответы [ 8 ]

48 голосов
/ 15 августа 2008

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

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
39 голосов
/ 20 мая 2010

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

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

5 голосов
/ 06 января 2009

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

3 голосов
/ 22 июня 2011

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

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

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

Session.Abandon();
Session.Clear();
1 голос
/ 02 января 2010

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

sqlcachedependency msdn

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

1 голос
/ 14 августа 2008

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

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

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

Cache.Remove(key);

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

1 голос
/ 14 августа 2008

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

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

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

0 голосов
/ 18 января 2011

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

...