Кэширование ASP.NET - программно аннулирует кеш сервера ... путаница на примере - PullRequest
2 голосов
/ 26 января 2011

Я читаю, как программно аннулировать кэшированные страницы на сервере в ASP.NET, и книга («MCTS Self-Paced Traing Kit (Exam 70-515)») говорит:

Чтобы напрямую контролировать, используется ли кэшированная версия страницы или страница генерируется динамически, ответьте на событие ValidateCacheOutput и установите допустимое значение для атрибута HttpValidationStatus.

Сегменты кода выглядят следующим образомследующее:

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;
}

protected void Page_Load(object sender, EventArgs e)
{
    Response.Cache.AddValidationCallback(
        new HttpCacheValidateHandler(ValidateCacheOutput),
        null);
}

Может кто-нибудь объяснить мне, что делает этот код?Кроме того, главный вопрос, который у меня возникает, заключается в том, что я думал, что кэшированные страницы просто возвращаются с сервера, но приведенный ниже код указывает, что вызывается жизненный цикл страницы (событие Page_Load);Я в замешательстве, потому что жизненный цикл страницы не вызывается, если возвращается кэшированная страница, так как же может сработать код в событии Page_Load?

Примечание. Вот такой же пример что книга имеет

Ответы [ 2 ]

2 голосов
/ 24 августа 2011

Я тоже сталкивался с этим вопросом. Очень жаль, что почти все сообщения в блоге и статьи, которые я нахожу по этой теме, покорно копируют пример MSDN , не объясняя, как это работает.

У меня нет определенного ответа, но я думаю, что это работает, потому что жизненный цикл страницы вызывается хотя бы один раз. А именно, когда страница запрашивается впервые и, следовательно, еще не кэширована. Во время этого первого запроса вызывается Page_Load, и HttpCacheValidateHandler регистрируется в объекте Cache. Во время всех последующих запросов на эту страницу объект Cache может вызывать ваш метод ValidateCacheOutput(). И поскольку этот метод static, жизненный цикл страницы не нужно вызывать.

Я надеюсь, что кто-то, кто знает больше об этом, может прокомментировать это, но, по моему мнению, это также подразумевает следующее:

  1. В данном примере HttpCacheValidateHandler не обязательно должен быть статическим методом страницы, поскольку он не использует никаких свойств объекта Page. Это может быть статический метод для любого другого понравившегося вам объекта.
  2. Метод ValidateCacheOutput(), вероятно, будет вызываться для каждого запроса страницы, а не только для страницы, которая (ab) используется для вызова Response.Cache.AddValidationCallback(). Может быть, я упускаю что-то очевидное, но я не вижу, как Cache «знает», какой HttpCacheValidateHandler принадлежит какой странице.
1 голос
/ 26 января 2011

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

Код, который вы перечислили, просто проверяет строку запроса на наличие переменной Status и использует ее значение, чтобы определить, следует ли (1) извлечь страницу из кэша, (2) очистить кэшированную страницу, повторно отрендерить ее и кэшируйте его или (3) просто проигнорируйте кеш и заново отрендерните страницу.

См. http://msdn.microsoft.com/en-us/library/system.web.httpvalidationstatus.aspx для вариантов состояния.

...