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

У меня есть страница 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). Есть идеи?

13.12.2008 07:39:33
2 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

0
17.12.2008 03:31:42

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

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

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

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

0
13.12.2008 10:12:01
извините за мое отсутствие (я в отпуске) я думаю, что вы правы. проблема в кавычках
AlfeG 15.12.2008 17:22:27