Поделиться через


Практическое руководство. Проверка допустимости кэшированной страницы

Обновлен: Ноябрь 2007

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

Программная проверка допустимости кэшированной страницы

  1. Назначьте обработчик событий типа 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
    
  2. В одном из событий жизненного цикла страницы (например, событие 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
    

См. также

Основные понятия

Кэширование страниц ASP.NET