Проблема с кешированием - PullRequest
       14

Проблема с кешированием

0 голосов
/ 13 декабря 2008

У меня есть страница aspx, но весь контент создается руками (да, я знаю, что мне нужно создать обработчик, у меня есть другой вопрос)

Я хочу кэшировать вывод в клиентском браузере. Проблема в том, что он кэшируется только для одного запроса.

        public static void ProceedCaching(string etag, string lastModify, string response, HttpResponse Response,
                                      HttpRequest Request)
    {
        Response.AddHeader("ETag", "\"" + etag + "\"");
        Response.AddHeader("Last-Modified", lastModify);
        Response.AppendHeader("Cache-Control", "Public");
        Response.AppendHeader("Expires",
                              DateTime.Now.AddMinutes(1).ToUniversalTime().ToString("r",DateTimeFormatInfo.InvariantInfo));

        string ifModified = Request.Headers["If-Modified-Since"];

        if (!string.IsNullOrEmpty(ifModified))
        {
            if (ifModified.Contains(";"))
                ifModified = ifModified.Remove(ifModified.IndexOf(';'));
        }

        string incomingEtag = Request.Headers["If-None-Match"];

        if (String.Compare(incomingEtag, etag) == 0 || string.Compare(ifModified, lastModify) == 0)
        {
            Response.StatusCode = 304;
            Response.End();
        }

        Response.Write(response);
        Response.End();
    }

это стало очень грязным. Как я уже сказал, он кэшируется только один раз. После получения HTTP 304 браузер отправит чистый запрос без кэширования информации (etag, lastmodified). Есть идеи?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2008

Нашли этот ответ здесь

Вообще говоря, это наиболее распространенные правила, которые соблюдаются (не беспокойтесь, если вы не понимаете деталей, это будет объяснено ниже):

  1. Если заголовки ответа сообщают кеш не хранить, не будет.
  2. Если запрос аутентифицирован или безопасный, он не будет кэширован.
  3. Если нет валидатора (ETag или Last-Modified заголовок) присутствует в ответе, и это не имеет явного свежесть информации, это будет считается не кэшируемым.
  4. кэшированное представление считается свежим (то есть, может быть отправлен на клиент без проверки с исходный сервер), если:
    • Срок действия истек время или другой заголовок, контролирующий возраст установить, и все еще в свежем период.
    • Если кеш браузера уже видел представление, и был установлен для проверки один раз за сеанс.
    • Если прокси-кеш недавно видел представление, и это был изменен относительно давно. Свежие представления подаются прямо из кеша, без проверка с сервером происхождения.
  5. Если представление устарело, исходный сервер будет предложено проверить это или сообщить кэш является ли эта копия все еще хорошо.

И У Microsoft есть хорошая статья, если вы не хотите ее кэшировать.

0 голосов
/ 13 декабря 2008

Ваш код-фрагмент отлично работает для меня, если я уберу цитаты, которые вы добавляете вокруг etag в первой строке. Но я предполагаю, что это просто ошибка во фрагменте, а не настоящая проблема, с которой вы столкнулись.

Firefox 3 даже не удосужился поразить сервер после того, как он получил первые 304. IE7 продолжает работать, но он правильно отправляет заголовки lastmod / etag и получает 304 каждый раз.

Вы уверены, что это не потому, что вы изменили настройки кэширования в вашем браузере? Я бы попробовал это в другом браузере, чтобы убедиться.

Чтобы сделать его немного чище, вы можете использовать методы Response.Caching вместо прямой установки заголовков.

...