2008-08-14 5 views
49

Для моего блога я хотел использовать кэш вывода для сохранения кэшированной версии perticular поста в течение приблизительно 10 минут, и то хорошо ...Выемка Page Cache в ASP.NET

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

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

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

ответ

45

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

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

Кто-нибудь знает, если что-то подобное доступно для классического ASP? – Brettski 2008-09-22 15:50:28

+0

Я не думаю, что кеширование доступно в ASP, поэтому не жаль. – GateKiller 2010-12-08 16:04:46

+0

Это очищает все кеши для каждого параметра для этой страницы. – Salim 2015-11-26 10:55:16

1

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

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

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

1

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

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

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

Cache.Remove(key); 

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

5

Использование Response.AddCacheItemDependency, чтобы очистить все outputcaches.

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.

1

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

sqlcachedependency msdn

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

38

Вышеупомянутые параметры являются точными, если вы знаете, на каких страницах вы хотите очистить кеш. В моем экземпляре (ASP.NET MVC) я ссылался на одни и те же данные со всего. Поэтому, когда я сделал [save], я хотел очистить кеш-сайт. Это то, что сработало для меня: 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); 
} 

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

Клиринговых кэша:

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

Надеется, что это помогает.

0

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

3

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

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

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

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