2011-01-16 25 views
8

Sto scrivendo un sito ASP.NET MVC che include la possibilità per gli utenti di creare account e accedere. Come voglio anche memorizzare il sito in modo aggressivo, Sono in esecuzione in alcuni problemi mescolando il caching con l'autenticazione.OutputCache dilemma con autenticazione in ASP.NET MVC

Su ogni pagina, nella parte superiore, se l'utente ha effettuato l'accesso, invio il nome utente, un collegamento al proprio profilo e un collegamento per disconnettersi. Se non sono connessi, emetto un collegamento di accesso standard. Inoltre, nella pagina stessa, alcuni contenuti non vengono mostrati agli utenti non autenticati, mentre altri contenuti dipendono da quale utente è connesso.

Ho tentato per la prima volta di risolvere questo problema qualche tempo fa chiedendo al team Stack Overflow come hanno risolto il problema. Jeff ha risposto che in pratica non fanno alcun caching per gli utenti non autenticati. Quindi, ho scritto un attributo che deriva da OutputCacheAttribute ma annulla il caching se l'utente ha effettuato il login.

Attualmente, sto utilizzando quell'attributo, ma in alcuni casi sto ottenendo risultati errati. Ad esempio, l'utente può visitare alcune pagine, quindi accedere, quindi visitare nuovamente la pagina, solo per visualizzare il link di accesso in alto, piuttosto che il loro nome utente.

Qui ci sono alcune soluzioni che sto valutando:

  • Impostazione del tipo HttpCacheability o Cache-Control-private, piuttosto che public. In questo modo, la risposta viene memorizzata solo nella cache lato client. Questo risolverà il problema? Se lo fa, questo avrà un effetto sull'efficienza della memorizzazione nella cache? Ho notato che Stack Overflow sembra utilizzare public, tuttavia.
  • Impostazione di un parametro VaryByCustom per memorizzare in cache in modo diverso per ciascun utente, ad esempio in this tutorial. Questo aiuterà, pur mantenendo l'efficienza e l'efficacia della memorizzazione nella cache?

Grazie in anticipo!

risposta

9

A seconda della struttura dell'applicazione, potrebbe essere opportuno memorizzare nella cache i dati anziché le viste.

Poiché le viste sono molto semplici e l'accesso al database di solito richiede la maggior parte del tempo necessario per eseguire il rendering di una pagina, è possibile ottenere gran parte del vantaggio della cache di output memorizzando nella cache il modello nel controller e tutte le parti non rimovibili della vista saranno essere inalterato in modo da poter memorizzare nella cache il contenuto pubblico visualizzato dagli utenti autenticati.

Esistono anche modi per far funzionare il caching dell'output con viste parziali, ma a mio parere aggiungono più complessità di quanto sia realmente giustificato.

Problemi correlati