Я использую директиву страницы outputcache для кеширования значений на основе VaryByParam. Есть ли способ предварительно заполнить кеш при запуске веб-приложения для набора общих параметров вместо того, чтобы ждать, пока пользователь перейдет на страницу? Или мне просто нужно написать сценарий, который обрабатывает все страницы, которые я хочу кэшировать? В идеале я могу сделать это на сервере где-нибудь в global.asax application_start?
Как мне предварительно заполнить выходной кэш в веб-приложении asp.net?
Ответы (3)
Очевидно, сейчас вы заинтересованы в решении, но посмотрите, что будет в ASP.NET 4. Есть два новых дополнения, которые могут вам помочь.
Во-первых, это возможность указать логику «разогрева» для приложений ASP.NET - вы настраиваете это в web.config и, при необходимости, указываете ему запускать код, реализующий IProcessHostPreloadClient. Подробнее см. Здесь: http://weblogs.asp.net/scottgu/archive/2009/09/15/auto-start-asp-net-applications-vs-2010-and-net-4-0-series.aspx
Во-вторых, вы получите подходящую модель поставщика для кэширования вывода. До сих пор был только один вариант: кеширование в рабочем процессе. Таким образом, каждый раз, когда происходит переработка, вы теряете свой кеш (и, конечно, вы ограничены ограничениями памяти). В ASP.NET 4 вы также получаете кэширование на основе диска из коробки. Подробнее см. Здесь: http://www.asp.net/learn/whitepapers/aspnet40/#_TOC1_2
Раньше я использовал сценарии разминки
http://programmerramblings.blogspot.com/2008/09/aspnet-site-warmup.html
Подобное решение будет в основном "пинговать" любую страницу. Этот «пинг» приведет к активации вашего кеша. Это также предотвратит переход пользователей на холодный веб-сайт, поэтому страницы будут полностью дрожать к тому времени, когда они туда попадут.
Изменить: я до сих пор не знаю, как я отношусь к запаху следующего решения, но как насчет запуска веб-запроса при запуске приложения на каждой странице?
string[] cachedPages = new string[] { "http://...", "http://...", ...};
foreach (var url in cachePages) {
var request = WebRequest.Create(url);
request.BeginGetResponse(null, null);
}
Зачем вам кэшировать вещи до того, как кто-то их действительно запросит? Разве это тоже не расходует ресурсы?
Я не уверен, что вы действительно можете кэшировать страницу динамически, как вы говорите, но вы можете добавлять объекты в кеш в файле Global.asax.
void Application_Start(object sender, EventArgs e)
{
}