Очистка кэша страниц в ASP.NET
-
08-06-2019 - |
Вопрос
Для своего блога я хочу использовать кэш выходных данных, чтобы сохранять кэшированную версию пертикулярного поста примерно на 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?
Таким образом, вы не реализуете пользовательский код очистки кэша и просто обновляете кэш по мере изменения содержимого в БД?
HttpRuntime.Close()
..Я пробую все методы, и это единственный, который работает для меня