2012-07-25 9 views
5

È possibile variare la cache di output in MVC in base a determinati valori nella sessione? Ho letto molto sull'utilizzo della funzionalità varybycustom e sulla sovrascrittura di GetVaryByCustomString in Global.asax, ma la sessione non è disponibile a questo punto.MVC OutputCache in base ai valori di sessione

public override string GetVaryByCustomString(HttpContext context, string custom) 
{ 
    if (custom == "somekey") 
     //Want to check the session here (but it isn't available). 

    return base.GetVaryByCustomString(context, custom); 
} 

Capisco che questo è perché la Sessione non viene creata fino a più tardi nella pipeline della richiesta.

La mia preoccupazione è che senza variare la cache in base alla sessione dell'utente, la pagina (che cambia in base a ciò che l'utente ha nella sessione, ha HTML aggiuntivo specifico per quell'utente ecc.) Verrà memorizzata nella cache (poiché l'URL è lo stesso) e servito dal nostro bilanciamento del carico, server proxy ecc. e poi servito ad altre richieste con le informazioni sulla sessione di altre persone nella pagina!

Il motivo per cui l'URL è lo stesso è che l'utente entra come "ospite", inserisce alcune informazioni (POST), questo viene convalidato e memorizzato nella sessione e quindi viene reindirizzato alla stessa pagina (che ora dovrebbe essere specifico per l'utente in base ai dati della sessione).

La pagina stessa deve essere memorizzata nella cache normalmente perché se un "guest" visita lo stesso URL, dovrebbe pubblicare la stessa pagina "standard" ogni volta.

È possibile variare la cache in questo modo?

risposta

0

Si dovrebbe cercare in "ciambella ciambella", ma questo non è supportato da ASP.NET MVC 3, almeno non fuori dalla scatola. Fortunatamente qualcuno ha già risolto questo problema per voi vedere MvcDonutCaching

Ho letto che ASP.NET MVC 4 includerà "ciambella foro ciambella" fuori dalla scatola, ma non posso dire se è nell'RC attuale o no.

2

Se si desidera personalizzare l'output della cache per utente, è meglio impostare la Posizione su OutputCacheLocation.Client come indicato di seguito. Maggiori informazioni here

[OutputCache(Duration=3600, VaryByParam="none", Location=OutputCacheLocation.Client, NoStore=true)] 
    public string GetName() 
    { 
     return "Hi " + User.Identity.Name; 
    } 
Problemi correlati