Средство послекэшевой подстановки (новое в ASP.NET 2.0) вращается вокруг единственного метода, добавленного в класс HttpResponse. Этот метод называется WriteSubstitution(), и он принимает один параметр — делегат, указывающий на метод обратного вызова, который вы реализуете в своем классе страницы.
Этот метод обратного вызова возвращает содержимое этой части страницы. Трюк заключается вот в чем: когда среда обработки страниц ASP.NET извлекает кэшированную страницу, то он автоматически инициирует ваш метод обратного вызова, чтобы получить от него динамическое содержимое. Затем она вставляет это содержимое в кэшированный НТМL-код страницы. Прелесть заключается в том, что даже если ваша страница еще не была помещена в кэш (она генерируется первый раз), ASP.NET все равно вызывает вашу функцию обратного вызова для получения динамического содержимого. По существу, идея состоит в том, что вы создаете метод, который генерирует некоторое динамическое содержимое, чем гарантируете, что он всегда будет вызван и то, что он выдаст, никогда не будет помещено в кэш.
Метод, генерирующий динамическое содержимое, должен быть статическим. Это объясняется тем, что ASP.NET должен иметь возможность вызвать его, даже если не существует доступного, экземпляра класса вашей страницы. (Очевидно, что когда ваша страница доставляется клиенту из кэша, объект страницы не создается.) Сигнатура метода достаточно проста — он принимает объект HttpContext, который представляет текущий запрос, и возвращает строку с новым HTML. Вот пример, возвращающий дату в жирном формате:
private static string GetDate(HttpContext context)
{
return "<b>" + DateTime.Now.ToString() + "</b>";
}
Чтобы вставить его в страницу, нужно в некоторой точке вызвать метод Response.WriteSubstitution():
protected void Page_Load(object sender, EventArgs e)
{
Response.Write ("This date is cashed with the page: ");
Response.Write(DateTime.Now.ToString() + "<br />");
Response.Write ("This date is not: ");
Response.WriteSubstitution(new HttpResponseSubstitutionCallback(GetDate));
}
Теперь, даже если применить кэширование к этой странице директивой OutputCache, дата все равно будет обновляться при каждом запросе, потому что обратный вызов минует процесс кэширования. На рис. 11.2 показан результат запуска страницы и обновления ее несколько раз.
Проблема этой техники в том, что послекэшевая подстановка работает на более низком уровне, чем остальная часть вашего пользовательского интерфейса. Обычно когда вы проектируете страницу ASP.NET, то вообще не используете объект Response — вместо этого применяются Web-элементы управления, и эти элементы управления используют объект Response для генерации своего содержимого. Одна проблема в том, что если вы используете объект Response, как показано в предыдущем примере, то теряете возможность позиционировать содержимое относительно остальной части страницы. Единственное реалистичное решение — поместить ваше динамическое содержимое в элемент управления некоторого вида. Таким образом, элемент управления может использовать Response.WriteSubstitution() при отображении самого себя. Вы узнаете больше об отображении элементов управления в главе 27.
предыдущая следующая страница вначало главы оглавление
491