Pregunta

Tengo una una página aspx, pero todo el contenido es generado por las manos (sí, sé que tengo que hacer un manipulador, tengo otra pregunta)

Quiero caché de resultados en el navegador del cliente. El problema es que se almacena en caché sólo para una consulta.

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

se ha convertido en preaty desordenado. Como ya he dicho se almacena en caché sólo una vez. Después recevieng HTTP 304 navegador enviará la solicitud limpia y sin almacenamiento en caché de la información (etag, LastModified). Tiene alguna idea?

¿Fue útil?

Solución

aquí

En términos generales, estas son las reglas más comunes que se siguen (no se preocupe si usted no entiende los detalles, como se explicará más adelante):

  1. Si los encabezados de la respuesta le dicen al caché no para mantenerla, no lo hará.
  2. Si la petición es autenticada o seguro, no va a ser almacenado en caché.
  3. Si no hay validador (un ETag o Last-Modified cabecera) está presente en una respuesta, y que no tiene ninguna explícita información frescura, será considerados no almacenable en caché.
  4. Una representación en caché se considera fresca (Es decir, capaz de ser enviado a una cliente sin consultar con el servidor de origen) si:
    • Tiene una caducidad momento u otro encabezado controlar la edad establecer, y todavía está dentro de la fresca período.
    • Si una memoria caché del navegador ya ha visto la representación, y se ha establecido para comprobar una vez por sesión.
    • Si un proxy caché ha visto la representación recientemente, y se modificó relativamente hace mucho tiempo. representaciones frescas se sirven directamente desde la memoria caché, sin la comprobación con el servidor de origen.
  5. Si es una representación rancio, el servidor de origen se le pedirá que validarlo, o decirle a la memoria caché si la copia que tiene es sigue siendo buena.

Microsoft tiene un buen artículo si no quiere que la memoria caché.

Otros consejos

Su código-fragmento funciona bien para mí si me quito las cotizaciones que está añadiendo alrededor de la etag en primera línea. Pero estoy adivinando eso es sólo un error en el fragmento, y no el verdadero problema que está enfrentando.

Firefox 3 dosnt siquiera se molesta para golpear el servidor después de que haya recibido el primer 304. IE7 sigue adelante, pero envía cabeceras / etag lastmod correctamente y recibe un 304 cada vez.

¿Está seguro de que no es porque se ha cambiado la configuración de almacenamiento en caché en el navegador? Me gustaría probarlo en otro navegador para asegurarse.

Para que sea un poco más limpia que podría utilizar los métodos de Response.Caching en lugar de establecer cabeceras directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top