Domanda

Qual è il modo migliore per gestire un utente che torna a una pagina che aveva elementi memorizzati nella cache in un'app asp.net?Esiste un buon modo per acquisire il pulsante Indietro (evento?) e gestire la cache in questo modo?

È stato utile?

Soluzione

Puoi provare a utilizzare il file Proprietà HttpResponse.Cache se può essere d'aiuto:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
   //...
}

Oppure potrebbe bloccare del tutto la memorizzazione nella cache della pagina HttpResponse.CacheControl, ma è stato deprecato a favore della proprietà Cache sopra:

Response.CacheControl = "No-Cache";

Modificare:OPPURE potresti davvero andare fuori di testa e fai tutto a mano:

Response.ClearHeaders();
Response.AppendHeader("Cache-Control", "no-cache"); //HTTP 1.1
Response.AppendHeader("Cache-Control", "private"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "no-store"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "must-revalidate"); // HTTP 1.1
Response.AppendHeader("Cache-Control", "max-stale=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "post-check=0"); // HTTP 1.1 
Response.AppendHeader("Cache-Control", "pre-check=0"); // HTTP 1.1 
Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.1 
Response.AppendHeader("Keep-Alive", "timeout=3, max=993"); // HTTP 1.1 
Response.AppendHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT"); // HTTP 1.1 

Altri suggerimenti

Per quanto ne so (o almeno ho letto) è meglio cercare di non lavorare in risposta agli eventi dell'utente, ma piuttosto pensare "nella pagina".

Architetta la tua applicazione in modo che non importi se viene premuto il pulsante Indietro.Si occuperà semplicemente di questo..Ciò potrebbe comportare un po' di lavoro extra dal punto di vista dello sviluppo, ma nel complesso renderà l'applicazione molto più robusta.

Ad esempio, se il passaggio 3 esegue alcune modifiche ai dati, l'utente fa clic indietro (al passaggio 2) e fa nuovamente clic su Avanti, quindi l'applicazione verifica se le modifiche sono state apportate.O idealmente, non ne produce alcuno difficile modifiche finché l'utente non fa clic su "OK" alla fine.In questo modo, tutte le modifiche vengono memorizzate e puoi ripopolare il modulo in base ai valori precedentemente immessi durante il caricamento, ogni volta.

Spero che abbia un senso :)

RFC 2616 §13.13 Dillo Storia e cache sono cose diverse.Non dovrebbe esserci assolutamente alcun modo per la cache di influenzare il pulsante Indietro.

Se una qualsiasi combinazione di intestazioni HTTP influisce sul pulsante Indietro, si tratta di un bug nel browser...con un'eccezione.

Nell'HTTPS i browser interpretano Cache-control: must-revalidate come richiesta di aggiornamento delle pagine quando viene utilizzato il pulsante Indietro (Mozilla la chiama "modalità stupida banca").Questo non è supportato in HTTP semplice.

Il modo migliore per gestirlo è probabilmente inserire una direttiva no-cache nelle pagine ASP.NET (o una pagina master se ne stai utilizzando una).Non penso che ci sia un modo per gestire questo problema direttamente nel tuo codice ASP.NET (poiché la decisione sulla cache avviene sul client).

Per quanto riguarda MVC, non so come lo realizzeresti (supponendo che sia diverso da ASP.NET basato su Web Form);Non l'ho usato.

Il seguente codice ha funzionato per me in IE9+, FF21 e l'ultimo Chrome:

Response.Cache.SetCacheability(HttpCacheability.NoCache | HttpCacheability.Private);
Response.Cache.AppendCacheExtension("must-revalidate");
Response.Cache.AppendCacheExtension("max-age=0");
Response.Cache.SetNoStore();

Puoi inserirlo Page_Load() gestore eventi in MasterPage in modo che ogni pagina nella tua app richieda un viaggio di andata e ritorno al server quando si preme il pulsante Indietro.

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