2011-12-21 14 views
14

Duplicar posible:
Cache v.s Session¿Cuál es la diferencia entre HttpRuntime.Cache y Session?

estoy usando un código que utiliza HttpRuntime.Cache para almacenar un valor. Sin embargo, cuando cierro la ventana, el caché desaparece. ¿Hay algún beneficio al usar esto durante la sesión?

Aquí está mi código:

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(); 
} 

Respuesta

22

HttpRuntime.Cache es global para la aplicación; se comparte entre todos los usuarios/sesiones del sitio web.

Session es único por sesión de usuario. Lo que una sesión de usuario almacena en el Session es privado para esa sesión. Otra sesión tendrá su propio almacenamiento.

+0

Hola, ¿HttpRuntime.Cache ["access_token"] está visible para todos los usuarios? Así es como estaba escrito en el tutorial, ¡esta sería una gran vulnerabilidad de seguridad entonces! – Darren

+1

La sesión también es única por subproceso de trabajo según http://stackoverflow.com/questions/2151251/asp-net-web-garden-how-many-worker-processes-do-i-need – Jeff

+1

@Jeff. Esa pregunta indica que con el almacenamiento de la sesión InProc normal, 'Session' es único por trabajador * process *, no por * thread *. La diferencia es enorme: ASP.NET siempre usa muchos hilos, pero muchos procesos solo cuando están configurados de esta forma. Con múltiples procesos de trabajo, 'Session' probablemente debería almacenarse fuera de proceso, lo cual es posible. –

4

Posiblemente la razón por la que está viendo la caché es que está reiniciando su servidor web cuando está volviendo a ejecutar su sitio. Esto haría parecer que el objeto de caché y la sesión se comportaban de la misma manera cuando de hecho son muy diferentes.

Podría ser, por ejemplo, que esto ocurra cuando se utiliza el servidor web incorporado de Visual Studio, es decir, cuando se ejecuta el sitio como una aplicación web.

Solo un pensamiento.

1

El objeto Cache vive solo en la memoria y es global para la aplicación. Los objetos pueden ser eliminados de Cache en cualquier momento por ASP.NET (aunque puede influir en eso hasta cierto punto con argumentos a Cache.Add()). Cuando la AppPool se recicla o se apaga debido a la inactividad, o si reinicia su aplicación (por ejemplo, al cambiar web.config), la Caché también se eliminará.

El solo hecho de cerrar una página web no es suficiente para soltar la caché.

El objeto Session es único por sesión de usuario (generalmente único por instancia de navegador). Al final de cada solicitud, puede ser serializado y almacenado en SQL Server, o simplemente guardado en la memoria (modo InProc), o ser serializado y enviado a una aplicación especializada llamada StateServer. Si está almacenado en la memoria, se perderá en las mismas condiciones que el Caché. Si está escrito en SQL Server, se mantendrá hasta que caduque la sesión, incluso si el AppPool se recicla.

Tenga en cuenta que el código en su pregunta debe usar un candado() al leer/actualizar el objeto Cache. De lo contrario, tienes una posible condición de carrera.

Cuestiones relacionadas