Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Используя Response.Добавьте cacheitemdependency, чтобы очистить все выходные кеши.

  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);
    }

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

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

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

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

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

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

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

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

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

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

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

Cache.Remove(key);

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

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

sqlcachedependency msdn

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top