2009-10-30 24 views
11

Almacenar toda la sesión en una cookie ha sido un estándar en Rails en los últimos años. ¿Existe alguna manera fácil de lograr algo similar con ASP MVC?Uso de cookies para almacenar sesiones en ASP MVC

De forma predeterminada, cualquier cosa en Session/TempData se almacena en la memoria en el servidor. En web.config esto se puede cambiar a un almacén de SQL/caché del lado del servidor. Me gustaría poder tener estos objetos persistidos en una cookie.

Parece que podría implementar un proveedor de tienda de estado de sesión personalizado. ¿Hay un enfoque más simple?

+1

¿Quisiste escribir 'toda la sesión en una cookie'? – codeulike

+0

sí - gracias –

Respuesta

4

sí, implemente un custom state session-provider. Y no, afaik no hay un enfoque más simple.

Ps. no es tan malo como parece, es decir,> la mitad del odbc sample está escribiendo en el db.

+0

Siguiendo con esto, implementé un proveedor de sesión de estado personalizado y fue realmente sencillo. Gracias por la ayuda. –

-2

depende de qué tipo de datos que desea almacenar en la cookie, si quieres sólo para cadena de almacenamiento, el siguiente código hará:

HttpCookie cookie = new HttpCookie("username","sth"); 
      cookie.HttpOnly = true; 
      cookie.Expires = DateTime.Now.AddMonths(3); 
      HttpContext.Current.Response.Cookies.Add(cookie); 
-1

no debería utilizar Sesiones para esto, pero los perfiles en lugar. Los perfiles usan cookies para unir computadoras a perfiles, etc. La clave de perfil se almacena en una cookie, y no se pierde al cerrar el navegador, etc.

Información aquí; http://odetocode.com/articles/440.aspx

2

No recomendaría almacenar toda la sesión en las cookies. Tiene malas implicaciones de rendimiento. Considere esto: cada solicitud (para cada recurso) contendrá una sobrecarga de datos posiblemente antiguos que solo necesita una o dos veces. Eventualmente, esta sobrecarga afectará a sus usuarios, su ancho de banda y el rendimiento de su sitio.

He aquí un ejemplo:

GET/HTTP/1.1 
Host: localhost 
OtherUsefulHeaders: foo 
Cookie: YourSessionState=... 

tamaño de la petición inicial es de alrededor de 200 bytes. Digamos que agrega alrededor de 100 bytes a su sesión. Ahora el tamaño es de 300 bytes y la sobrecarga es ~ 30%. Agrega otros 100 bytes y la sobrecarga es del 50%. Lo que significa que requiere aproximadamente 2 veces el tiempo para enviar la solicitud y 2x de ancho de banda.

Debería mirar en cookie-based TempData implementation ya que tiene una huella mucho más pequeña y realmente tiene sentido.

+1

¿Cómo sería más rápido el mantenimiento de la información de la sesión a través de TempData (implementado a través de una tienda de cookies)? También está la sobrecarga de código adicional de mantener ese TempData. Una sesión debe ser bastante ligera, en nuestro caso son unas pocas docenas de bytes, por lo que la sobrecarga de la solicitud debe ser mínima. Una tienda de sesión basada en cookies se adoptó como estándar en Rails en 2007. En este artículo se explica por qué hicieron ese movimiento. http://ryandaigle.com/articles/2007/2/21/what-s-new-in-edge-rails-cookie-based-sessions –

+1

Estoy muy feliz por la comunidad de Rails, pero mi punto es basado en datos estadísticos: http://yuiblog.com/blog/2007/03/01/performance-research-part-3/. TempData es ventajoso durante la sesión en que su sobrecarga se aplica solo una vez, durante una ida y vuelta de página. De lo contrario, las cookies deberían estar limpias. De todos modos, después de una amarga experiencia en un escenario de granja web, no uso Session en absoluto, no vale la pena. – DreamSonic

+0

¿qué método estás usando ahora para el estado de la sesión? Hubiera pensado que el objeto de la sesión (ya sea inproc o no) o una cookie son las únicas opciones? – UpTheCreek

5

Creo que sería mucho más eficiente almacenar la ID de sesión (un hash o lo que sea) en la cookie, y luego usar esa ID para obtener los datos de la sesión de la memoria/base de datos/el almacenamiento que prefiera. Mantener el estado de sesión completo en una cookie aumenta el ancho de banda innecesariamente.

Además, tenga en cuenta la seguridad: si la cookie contiene información de autenticación u otros datos confidenciales y no tiene cuidado, el usuario puede piratearla fácilmente para obtener privilegios o complicar su aplicación (encriptar los datos es una mierda también, porque entonces tiene que codificar en base 64 los datos encriptados, lo que desperdicia aún más el ancho de banda y el tiempo de procesamiento). Debe nunca entrada de confianza del usuario.

+0

¿Sería necesario un almacén de estado de sesión personalizado en este caso o simplemente tendría sentido desactivar la sesión en el web.config? –

Cuestiones relacionadas