Как программно очистить кеш ASP.NET? - PullRequest
0 голосов
/ 24 марта 2011

В ASP.NET Webforms я могу использовать <% @ OutputCache Duration = "3600" VaryByParam = "none"%> для кэширования веб-страницы. У меня есть очень статичные данные, которые будут редко обновляться, но при их обновлении HTML на веб-странице изменится. Эти данные будут привязаны к системе управления, позволяющей сопровождающим вносить соответствующие изменения.

Я бы хотел иметь возможность установить длительность OutputCache очень большим. Но я также хотел бы иметь возможность очищать эту веб-страницу из кэша при обновлении данных (предпочтительно со страницы редактирования данных).

Каков стандартный способ сделать это в ASP.NET?

Ответы [ 3 ]

1 голос
/ 24 марта 2011
For Each de As DictionaryEntry In HttpContext.Current.Cache
   HttpContext.Current.Cache.Remove(DirectCast(de.Key, String))
Next

MSDN Cache.Remove

Редактировать: Вот дополнительная информация о том, как удалить страницу из OutputCache:

0 голосов
/ 14 июня 2015

Я думаю, что отмеченное решение не работает на II7 +. Итак, вот еще один подход, который я использовал для очень похожей проблемы.

Если вашей БД является SQL Server, вы можете использовать SQLDependency, но если нет, то обходным путем будет использование зависимости файла следующим образом.

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

Итак, вы можете сделать так, чтобы ваша dataentrypage записывал лог / текстовый файл после каждого успешного обновления базы данных. Сделайте файл журнала зависимым от рассматриваемой веб-страницы.

Итак. На вашей веб-странице.aspx.cs

защищенный void Page_Load (отправитель объекта, EventArgs e) { string fileDependencyPath = Server.MapPath ("~ / dblog / dataupdate.txt"); Response.AddFileDependency (fileDependencyPath); // остальная часть кода }

В ваших dataentrypage.aspx.cs

       string path = "~/dblog/dataupdatelog.txt";
        if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path)))
        {
            File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close();
        }
        using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path)))
        {
            w.WriteLine("\r\nLog Entry : ");
            w.WriteLine("{0}", DateTime.Now.ToString());
            string strlog = "Some additional info";
            w.WriteLine( strlog);
            w.WriteLine("__________________________");
            w.Flush();
            w.Close();

}

0 голосов
/ 24 марта 2011

AFAIK, ASP.NET определит, изменилась ли страница, и, если это так, отправит вновь сгенерированный вывод по проводам (который затем будет кэширован как часть процесса);затем, когда страница запрашивается в следующий раз, она извлекается из кэша, если только страница еще не изменилась.

От MSDN :

Когда кэшируетсястраница запрашивается пользователем, ASP.NET определяет, является ли кэшированный вывод по-прежнему действительным на основе политики кэширования, определенной для страницы.Если выходные данные действительны, кэшированные выходные данные отправляются клиенту, и страница не обрабатывается повторно.ASP.NET позволяет запускать код во время этой проверки, так что вы можете написать собственную логику, чтобы проверить, является ли страница действительной.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...