Практическое руководство. Проверка допустимости кэшированной страницы
Обновлен: Ноябрь 2007
При запросе пользователем кэшированной страницы, ASP.NET определяет, являются ли кэшированные выходные данные допустимыми, на основе политики кэширования, определенной на странице. Если выходные данные являются допустимыми, кэшированные выходные данные отправляются клиенту, и для страницы не выполняется повторная обработка. Тем не менее, ASP.NET позволяет во время проверки на допустимость выполнять код с помощью проверочного обратного вызова, чтобы обеспечить возможность записи настраиваемой логики для проверки допустимости страницы. Проверочный обратный вызов дает возможность проверять кэшированные страницы за пределами стандартного процесса использования кэш-зависимостей.
Программная проверка допустимости кэшированной страницы
Назначьте обработчик событий типа HttpCacheValidateHandler и включите код, который будет проверять допустимость возвращаемой кэшированной страницы.
Обработчик проверки должен возвращать одно из следующих значений HttpValidationStatus:
Invalid Означает, что кэшированная страница недопустима. Страница удаляется из кэша, и запрос обрабатывается как не попавший в кэш.
IgnoreThisRequest Принудительно обрабатывает запрос, как не попавший в кэш. Для страницы, таким образом, выполняется повторная обработка, но кэшированная страница не становится недопустимой.
Valid Указывает, что кэшированная страница является допустимой.
В приведенном ниже примере показано использование обработчика проверки с именем ValidateCacheOutput, который определяет, содержит ли переменная строки запроса status значения «недопустимо» или «игнорировать». Если состояние имеет значение «invalid», метод возвращает Invalid и страница становится недопустимой для кэша. Если состояние имеет значение «ignore», метод возвращает IgnoreThisRequest и страница остается в кэше, но для данного запроса создается новый ответ.
public static void ValidateCacheOutput(HttpContext context, Object data, ref HttpValidationStatus status) { if (context.Request.QueryString["Status"] != null) { string pageStatus = context.Request.QueryString["Status"]; if (pageStatus == "invalid") status = HttpValidationStatus.Invalid; else if (pageStatus == "ignore") status = HttpValidationStatus.IgnoreThisRequest; else status = HttpValidationStatus.Valid; } else status = HttpValidationStatus.Valid; }
Public Shared Sub ValidatePage(ByVal context As HttpContext, _ ByVal data As [Object], ByRef status As HttpValidationStatus) If Not (context.Request.QueryString("Status") Is Nothing) Then Dim pageStatus As String = context.Request.QueryString("Status") If pageStatus = "invalid" Then status = HttpValidationStatus.Invalid ElseIf pageStatus = "ignore" Then status = HttpValidationStatus.IgnoreThisRequest Else status = HttpValidationStatus.Valid End If Else status = HttpValidationStatus.Valid End If End Sub
В одном из событий жизненного цикла страницы (например, событие Load страницы) необходимо вызвать метод AddValidationCallback, передающий в качестве первого аргумента обработчик событий, определенный в шаге 1.
В следующем примере кода метод ValidateCacheOutput задается как обработчик проверки.
protected void Page_Load(object sender, EventArgs e) { Response.Cache.AddValidationCallback( new HttpCacheValidateHandler(ValidateCacheOutput), null); }
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Response.Cache.AddValidationCallback( _ New HttpCacheValidateHandler(AddressOf ValidatePage), Nothing) End Sub