2011-12-21 23 views
14

Eventuali duplicati:
Cache v.s SessionQual è la differenza tra HttpRuntime.Cache e Session?

Sto usando un po 'di codice che utilizza HttpRuntime.Cache per memorizzare un valore. Tuttavia, quando chiudo la finestra, la cache scompare. C'è qualche vantaggio nell'utilizzare questo oltre la sessione?

Ecco il mio codice:

protected dynamic Code() 
{ 
    dynamic code; 

    if (String.IsNullOrEmpty(myHttpContext.Request.QueryString["code"])) 
    { 
     code = HttpRuntime.Cache["code"]; 
    } 
    else 
    { 
     code = myHttpContext.Request.QueryString["code"]; 
     HttpRuntime.Cache.Insert("code", myHttpContext.Request.QueryString["code"]); 
    } 

    return code; 
} 

protected string GetAccessToken(bool regenerate = false) 
{ 
    if (HttpRuntime.Cache["access_token"] == null || regenerate == true) 
    { 
     try 
     { 
      Dictionary<string, string> args = GetOauthTokens(myHttpContext.Request.QueryString["code"]); 
      HttpRuntime.Cache.Insert("access_token", args["access_token"], null, DateTime.Now.AddMinutes(Convert.ToDouble(args["expires"])), TimeSpan.Zero); 
     } 
     catch 
     { 
      OutputError("Code", "Bad Verification Code"); 
     } 
    } 

    return HttpRuntime.Cache["access_token"].ToString(); 
} 

risposta

22

HttpRuntime.Cache è globale per l'applicazione; è condiviso tra tutti gli utenti/sessioni del sito web.

Session è univoco per sessione utente. Quello che una sessione utente memorizza nello Session è privato per quella sessione. Un'altra sessione avrà il proprio spazio di archiviazione.

+0

Salve quindi HttpRuntime.Cache ["access_token"] è visibile a tutti gli utenti? Ecco come è stato scritto nel tutorial, questa sarebbe una vulnerabilità di sicurezza molto grande allora! – Darren

+1

La sessione è anche univoca per thread di lavoro in base a http://stackoverflow.com/questions/2151251/asp-net-web-garden-how-many-worker-processes-do-i-need – Jeff

+1

@Jeff. Questa domanda afferma che con la normale archiviazione di sessione InProc, 'Session' è univoco per worker * process *, non per * thread *. La differenza è enorme: ASP.NET usa sempre molti thread, ma molti processi solo se configurato in questo modo. Con più processi di lavoro, 'Session' dovrebbe probabilmente essere memorizzato out-of-process che è possibile. –

4

Probabilmente il motivo per cui si sta visualizzando la cache è che si sta riavviando il server Web quando si esegue nuovamente il test del sito. Ciò farebbe sembrare che l'oggetto cache e la sessione si comportassero allo stesso modo quando in realtà sono molto diversi.

Potrebbe essere ad esempio che ciò accade quando si utilizza il server Web incorporato di Visual Studio, ad esempio quando si esegue il sito come applicazione Web.

Solo un pensiero.

1

L'oggetto Cache vive solo in memoria ed è globale per l'applicazione. Gli oggetti possono essere rimossi da Cache in qualsiasi momento da ASP.NET (anche se è possibile influenzarli in qualche modo con gli argomenti di Cache.Add()). Quando AppPool si ricicla o si arresta a causa di inattività, o se si riavvia l'applicazione (ad esempio cambiando web.config), la cache verrà eliminata.

La chiusura di una pagina Web non è sufficiente da sola per eliminare la cache.

L'oggetto Session è univoco per sessione utente (in genere univoco per istanza del browser). Alla fine di ogni richiesta, in può essere serializzato e archiviato in SQL Server, o semplicemente tenuto in memoria (modalità InProc), o serializzato e inviato a un'app specializzata denominata StateServer. Se è memorizzato, verrà perso nelle stesse condizioni di Cache. Se è stato scritto su SQL Server, verrà mantenuto fino alla scadenza della sessione, anche se l'AppPool viene riciclato.

Si noti che il codice nella domanda deve utilizzare un blocco() durante la lettura/aggiornamento dell'oggetto Cache. Altrimenti, hai una potenziale condizione di competizione.

Problemi correlati