Domanda

Ho una pagina aspx una, ma tutti i contenuti è generato da mani (sì, lo so che ho bisogno di fare un gestore, ho un'altra domanda)

Voglio cache di output nel browser del client. Il problema è che è memorizzato nella cache per una sola interrogazione.

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

è diventato preaty disordinato. Come ho già detto che è memorizzato nella cache solo una volta. Dopo recevieng HTTP 304 browser invierà richiesta pulita senza caching informazioni (ETAG, LastModified). Ha tutte le idee?

È stato utile?

Soluzione

Trovato questa risposta qui

In generale, queste sono le regole più comuni che si susseguono (non preoccupatevi se non capite i dettagli, verrà spiegato più avanti):

  1. Se le intestazioni della risposta raccontano la cache non di tenerlo, non lo farà.
  2. Se la richiesta è autenticata o sicuro, non verrà memorizzata nella cache.
  3. Se non validatore (un ETag o dell'ultima modifica intestazione) è presente su una risposta, e non ha alcuna esplicita informazioni freschezza, sarà considerato in cache.
  4. Una rappresentazione memorizzata nella cache è considerato fresco (Cioè, in grado di essere inviato ad un cliente senza essersi consultato con il server di origine) se:
    • Ha una scadenza volta o l'altra intestazione all'età di controllo set, ed è ancora all'interno del fresco periodo.
    • Se una cache del browser ha già visto la rappresentazione, e è stato impostato per controllare una volta una sessione.
    • Se un proxy cache ha visto la rappresentazione di recente, ed è è stato modificato relativamente molto tempo fa. rappresentazioni freschi sono serviti direttamente dalla cache, senza il controllo con il server di origine.
  5. Se una rappresentazione è stantio, il server di origine verrà chiesto di convalidare, o dire la cache se la copia che ha è ancora buono.

Microsoft ha un buon articolo, se non si vuole che la cache.

Altri suggerimenti

Il tuo codice-frammento funziona bene per me se tolgo le quotazioni si stanno aggiungendo in tutto l'etag in prima linea. Ma im indovinare questo è solo un errore nel frammento, e non è il vero problema che si trovano ad affrontare.

Firefox 3 dosnt nemmeno la briga di colpire il server dopo aver ricevuto il primo 304. IE7 continua ad andare, ma invia correttamente le intestazioni / ETAG lastmod e riceve un 304 ogni volta.

Sei sicuro che la sua non perché avete cambiato le impostazioni di caching nel tuo browser? Vorrei provare in un altro browser per assicurarsi.

Per rendere un po 'più pulito è possibile utilizzare i metodi su Response.Caching invece di impostare direttamente le intestazioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top