Как предварительно заполнить кэш вывода в веб-приложении asp.net? - PullRequest
1 голос
/ 08 октября 2009

Я использую директиву страницы outputcache для кэширования значений на основе VaryByParam. Есть ли способ, которым я могу предварительно заполнить кэш, когда веб-приложение запускается для набора общих параметров, вместо того, чтобы ждать, пока пользователь нажмет страницу? Или мне просто нужно написать скрипт, который охватывает все страницы, которые я хочу кэшировать? В идеале я могу сделать это на сервере где-нибудь в global.asax application_start?

Ответы [ 3 ]

2 голосов
/ 08 октября 2009

Очевидно, что вы сейчас заинтересованы в решении, но посмотрите, что будет в 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

1 голос
/ 08 октября 2009

В прошлом я использовал сценарии разминки

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);
}
0 голосов
/ 08 октября 2009

Почему вы хотите кэшировать вещи до того, как кто-то их на самом деле запросит? Разве это не расходует ресурсы?

Я не уверен, что вы можете динамически кэшировать страницу, как вы говорите, но вы можете добавить объекты в кэш в файле Global.asax.

void Application_Start(object sender, EventArgs e) 
{

}
...