Для своего блога я хочу использовать выходной кэш, чтобы сохранить кэшированную версию сообщения в формате чёрной рамки примерно на 10 минут, и это нормально ...
<%@OutputCache Duration="600" VaryByParam="*" %>
Однако, если кто-то публикует комментарий, я хочу очистить кеш, чтобы страница обновлялась, и комментарий можно было увидеть.
Как мне сделать это в ASP.Net C #?
Хм. Вы можете указать атрибут VaryByCustom для элемента OutputCache. Значение этого параметра передается в качестве параметра в метод GetVaryByCustomString, который можно реализовать в global.asax. Значение, возвращаемое этим методом, используется в качестве индекса для кэшируемых элементов - например, если вы возвращаете количество комментариев на странице, каждый раз при добавлении комментария новая страница будет кэшироваться.
Предостережение в том, что это на самом деле не очищает кеш. Если в блоге часто используются комментарии, ваш метод может взорваться в размере с помощью этого метода.
В качестве альтернативы, вы можете реализовать неизменяемые фрагменты страницы (навигация, реклама, фактическая запись в блоге) в качестве пользовательских элементов управления и реализовать частичное кэширование страниц на каждом из этих пользовательских элементов управления.
Если вы измените «*» на параметры, от которых должен зависеть кеш (PostID?), Вы можете сделать что-то вроде этого:
//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);
и когда кто-то добавляет комментарий ...
Cache.Remove(key);
Я думаю, это будет работать даже с VaryByParam *, поскольку все запросы будут привязаны к одной и той же зависимости кэша.
Я нашел ответ, который искал:
HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");
Использование 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.
почему бы не использовать зависимость sqlcache для таблицы сообщений?
Таким образом, вы не реализуете пользовательский код очистки кеша и просто обновляете кеш при изменении содержимого в БД?
Вышесказанное хорошо, если вы знаете, для каких страниц вы хотите очистить кеш. В моем случае (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);
Надеюсь это поможет.
OutputCacheAttribute.ChildActionCache = new MemoryCache("NewRandomStringNameToClearTheCache");
для очистки весь «дочерний кэш действий» (для всех дочерних действий - кажется, нет лучшего подхода без использования библиотеки). dotnet.dzone.com/articles/programmatics-clearing-0HttpRuntime.Close()
.. Я пробую все методы, и это единственное, что работает для меня
На событии загрузки главной страницы, пожалуйста, напишите следующее:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
и в кнопке выхода нажмите:
Session.Abandon();
Session.Clear();