2010-01-17 14 views
5

Esiste un modo semplice per memorizzare nella cache l'intera pagina ASP.NET solo per utenti anonimi (l'autenticazione basata moduli è utilizzata)?Cache Pagina ASP.NET solo per utenti anonimi

Contesto: sto creando un sito Web in cui le pagine visualizzate dagli utenti anonimi sono per lo più completamente statiche, ma le stesse pagine visualizzate per gli utenti registrati non lo sono.

Certo che posso farlo a mano attraverso il codice dietro, ma ho pensato che ci potrebbe essere un modo migliore/più facile/più veloce.

+0

Hai mai avuto una soluzione a questo problema? Abbiamo una necessità simile a cui varyByCustom non è la risposta. –

+0

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. –

+0

Potresti condividere la tua soluzione codebehind? Come controlli la cache in questo modo? –

risposta

1

È possibile utilizzare VaryByCustom e utilizzare una chiave come username.

+0

Il problema è che memorizza nella cache anche le pagine visualizzate dagli utenti che hanno effettuato l'accesso. Nel mio caso, quelle pagine sono già parzialmente memorizzate nella cache, mentre alcune parti non possono essere memorizzate nella cache (anche per lo stesso utente). Ovviamente, posso impostare la chiave VaryByCustom su un valore casuale se l'utente è connesso, ma avrà enormi problemi di prestazioni. –

3

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.

+0

Grazie, questo ha funzionato a meraviglia per me. – Dusda

1

Non c'è nulla ti impedisce di estendere l'attributo esistente con il comportamento desiderato,

ad esempio:

public class AnonymousOutputCacheAttribute : OutputCacheAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
      return; 

     base.OnActionExecuting(filterContext); 
    } 
} 

non ho ancora testato, ma non vedo motivo per cui questo shouldn' lavoro.

Problemi correlati