В своем блоге я хочу использовать кэш вывода, чтобы сохранить кешированную версию поста в течение примерно 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");
Я не думаю, что кеширование было доступно в ASP, так что извините.
Это очищает все кеши для каждого для всех параметров этой страницы.
Я использую MVC 5.2.3, где мне писать этот код?
Я использую веб-пользовательский элемент управления для динамических меню, я использую кэш вывода и хочу удалить кеш при выходе из системы, я использовал ваше решение и передал свой путь пользовательского элемента управления, но у меня это не сработало.
Использование 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.
Отлично, это то, что я ищу. Вам следует изменить только одно. HttpContext.Current.Cache.Remove (cacheKey);
почему бы не использовать sqlcachedependency для таблицы сообщений?
Таким образом, вы не реализуете собственный код очистки кеша и просто обновляете кеш по мере изменения содержимого в базе данных?
Вышеупомянутое нормально, если вы знаете, для каких страниц вы хотите очистить кеш. В моем случае (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);
Надеюсь это поможет.
Ir работает только для кеширования всей страницы. Это не работает для дочерних действий. Какие-либо предложения?
and.maz вы в этом разобрались?
@ and.maz Если вы догадались, как это сделать для дочерних действий, есть награда здесь.
У меня это не сработало. Невозможность очистить элементы кеша кажется огромным недостатком mvc.
Вероятно, вы не можете очистить кеш, потому что вы используете @ Html.Action () для визуализации частичного представления. Вам придется использовать OutputCacheAttribute.ChildActionCache = new MemoryCache("NewRandomStringNameToClearTheCache"); для очистки всего «кеша дочерних действий» (для всех дочерних действий - кажется, нет лучшего подхода без использования библиотеки). dotnet.dzone.com/articles/programmatically-clearing-0
@Kevin, можете ли вы объяснить, как очистить все кешированные страницы веб-сайта после выхода из системы?
HttpRuntime.Close() .. Я пробую все методы, и это единственный, который у меня работает
Я подозреваю, что это закрывает процесс приложения ASP.NET в IIS. Это кажется немного чрезмерным, вероятно, очистит все кеши и вызовет значительные проблемы с производительностью на крупных веб-сайтах.
В событии загрузки главной страницы напишите следующее:
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
и в кнопке выхода нажмите:
Session.Abandon();
Session.Clear();
кто-нибудь знает, доступно ли что-то подобное для классического ASP?