Сведения о вопросе

1234123213

06:55, 23rd August, 2020

Теги

c#   asp.net   outputcache    

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

Просмотров: 480   Ответов: 8

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

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

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

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



  Сведения об ответе

$DOLLAR

18:10, 28th August, 2020

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

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


  Сведения об ответе

lesha

17:13, 20th August, 2020

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

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

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

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

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


  Сведения об ответе

+-*/

10:39, 4th August, 2020

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

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


  Сведения об ответе

fo_I_K

01:15, 25th August, 2020

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

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

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

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


  Сведения об ответе

lool

22:42, 2nd August, 2020

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

sqlcachedependency msdn

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


  Сведения об ответе

SILA

21:06, 1st October, 2020

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

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

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


  Сведения об ответе

PHPH

17:22, 16th August, 2020

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

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

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

Cache.Remove(key);

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


  Сведения об ответе

dumai

11:46, 28th August, 2020

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться