Sto usando asp.net MVC, quindi ho fatto questo nel mio controller
if (User.Identity.IsAuthenticated) {
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.Now.AddMinutes(-1));
Response.Cache.SetNoStore();
Response.Cache.SetNoServerCaching();
}
else {
Response.Cache.VaryByParams["id"] = true; // this is a details page
Response.Cache.SetVaryByCustom("username"); // see global.asax.cs GetVaryByCustomString()
Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Server);
Response.Cache.SetValidUntilExpires(true);
}
La ragione per cui l'ho fatto in questo modo (invece di dichiarativo) mi è stato anche bisogno la possibilità di accenderlo e spento via configurazione (non mostrato qui, ma c'è un controllo extra nella variabile if for my config).
È ancora necessario variare il nome utente, altrimenti non si eseguirà questo codice quando viene visualizzato un utente connesso. La mia funzione GetVaryByCustomString restituisce "anonymous" quando non autenticato o il nome degli utenti quando disponibili.
Hai mai avuto una soluzione a questo problema? Abbiamo una necessità simile a cui varyByCustom non è la risposta. –
Attualmente utilizzo la soluzione code-behind, in cui posso facilmente decidere se voglio memorizzare la pagina o meno. Se l'utente non ha effettuato l'accesso, memorizzo nella cache. Se l'utente ha effettuato l'accesso, la cache è disabilitata per un'intera pagina (e memorizza nella cache solo le parti "statiche"). Dopo aver ricevuto la risposta di seguito, ho cercato una soluzione senza code-behind, ma non ho trovato nulla di utile. Dopo tutto, una soluzione code-behind è anche molto chiara e non presenta grossi svantaggi rispetto a quella pura ASP.NET. –
Potresti condividere la tua soluzione codebehind? Come controlli la cache in questo modo? –