This article is currently in the process of being translated into Spanish (~99% done).
Sessions
En el capítulo anterior, discutimos sobre las cookies y su importancia en el mundo de la web, donde la necesidad de perseverancia entre solicitudes es vital, debido a la falta de estado del protocolo HTTP. En la mayoría de los frameworks de web, incluso en los de la vieja escuela, como PHP y ASP Classic, el concepto de sesión existe.
Sesiones vs. Cookies
Mientras las cookies son comúnmente usadas para compartir datos entre solicitudes por largos periodos de tiempo, incluso varios años, las sesiones están diseñadas para existir por el periodo que dure la sesión actual. Una sesión de navegación web puede ser difícil de definir, especialmente con el cambio de una computadora de escritorio o portátil a dispositivos de mano, donde una sesión de navegación es comúnmente detenida y reanudada muchas veces. En general, debieras tratar los datos almacenados en el sistema de sesiones como temporales - podrían desaparecer en cualquier momento, p.ej. porque el usuario cerro la ventana de navegación o reinicio su dispositivo de mano.
Por defecto, los datos de una sesión son almacenados por 20 minutos desde la última solicitud. de esta manera, si accedes a una página y algo es almacenado como datos de sesión, serán eliminados automáticamente después de 20 minutos, a menos que hayas hecho una nueva solicitud dentro de este periodo de tiempo. Puedes cambiar la duración de periodo de espera cuando configuras la sesión para tu sitio web (ver abajo), pero como se ha mencionado, no deberías tratar de usar sesiones para almacenar datos por largos periodos.
Entonces, si estas buscando almacenar datos entre múltiples sesiones, usa cookies - de lo contrario, el mecanismo de sesiones es una buena alternativa. Para entender los diferentes usos, piensa en un sistema de inicio de sesión clásico, donde el usuario puede marcar un checkbox para "permanecer ingresado": Si éste no esta marcado, el estado de conexión podría ser almacenado como sesión y luego desaparecer cuando el usuario abandone el sitio p.ej. cerrando el navegador. Si está marcado, una cookie debería ser usada en su lugar, dando como resultado que el usuario aún tendrá la sesión iniciada la próxima vez que encienda su computador y visite tu sitio web.
Sin embargo, discutir sobre sesión vs. cookies es divertido, porque en general, las sesiones realmente no pueden existir sin cookies. La razón es que mientras las cookies son almacenadas en el dispositivo del usuario (como pequeños archivos de texto), los datos de sesión son almacenados (temporalmente, en memoria) en el servidor. Sin embargo, como tu sitio web tendrá mas de un visitante, el servidor necesita saber a que visitante pertenecen los datos de cada sesión. Por esto, creará un identificador de sesión (ID), que se almacena en una, así llamada, sesión-cookie en el dispositivo de visitante. Con éste ID, el visitante puede acceder a los datos de su sesión a través de multiples solicitudes.
ASP.NET Core MVC: Agregando soporte para sesiones
En versiones previas de ASP y ASP.NET Frameworks, las sesione estarían disponibles inmediatamente. Aunque ASP.NET Core es mucho más modular, permitiéndote agregar los bloques de construcción necesarios cuando los necesites. Las sesiones son uno de esos bloques de construcción, así que tendremos que agregar soporte para ellos. Esto requiere dos pasos:
Primero necesitas instalar paquete de NuGet Microsoft.AspNetCore.Session en tu proyecto. Este contiene todo lo que necesitas para soporte de sesión. Puedes instalarlo desde la Interfaz de Usuario (UI), o usando la consola de administración de NuGet: En el menu Tools, seleccionando NuGet Package Manager -> Package Manager Console. En la ventana de herramientas de consola, simplemente digita el siguiente comando y presiona Enter:
Install-Package Microsoft.AspNetCore.Session
Luego que el paquete sea instalado, el segundo paso será agregar el soporte en tu sitio web. Se debe hacer en el archivo Startup.cs, primero llamando al método AddSession() en el método ConfigureServices(), de la siguiente forma:
public void ConfigureServices(IServiceCollection services)
{
services.AddSession();
services.AddMvc();
}
Observa que puedes, opcionalmente, pasar una o varias opciones para ser utilizadas por la funcionalidad de sesión. Una de las cosas que puedes configurar con este enfoque es el tiempo de duración, como se ha descrito previamente en este artículo, de la siguiente forma:
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
});
En segundo lugar, debes llamar al método extendido UseSession() del método Configure():
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseSession();
app.UseMvcWithDefaultRoute();
}
Usando Sesiones
Con el soporte de sesiones habilitado, podemos empezar a usarlos accesando la propiedad Session en HttpContext. Cuando incluyes el nombre de espacio Microsoft.AspNetCore.Http, puedes acceder a varios métodos Get* y Set* que pueden ser usados para recuperar datos almacenados como datos de sesión.
Permíteme demostrar esto con un completo, aunque muy simple, ejemplo. Es básicamente una Vista con una Forma, donde el usuario puede ingresar su nombre. Una vez que sea enviado, el nombre es almacenado como dato de sesión y luego automáticamente transferido a la Vista y al campo de entrada. Esto te permitirá ver el nombre ingresado incluso después de redireccionar o volver a cargar la página. Primero, la Vista:
@model string
<h1>Sessions</h1>
<form asp-action="SaveName" method="post">
Your name:
<input type="text" name="name" value="@Model" />
<input type="submit" value="Save" />
</form>
Observa como he definido el Modelo como un string en la parte superior, y luego como se ha usado dentro del textbox. Esto me permite pasar este simple string a la Vista desde el Controlador:
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace HelloMVCWorld.Controllers
{
public class SessionsController : Controller
{
public IActionResult Index()
{
string name = HttpContext.Session.GetString("Name");
return View(model: name);
}
public IActionResult SaveName(string name)
{
HttpContext.Session.SetString("Name", name);
return RedirectToAction("Index");
}
}
}
Todo es muy básico: En la acción Index(), trato de obtener los datos de sesión con el método GetString(), usando "Name" como clave. Si no esta presente, un NULL será devuelto - no importa que, simplemente los pasamos al método View(). en la acción SaveName(), donde la FORMA publica de vuelta, usamos el método SetString(), pasando "Name" como clave y el "name" enviado como el valor. Entonces redireccionamos hacia la acción Index(), la que ahora puede leer el "Name" almacenado y mostrarlo en el textbox:
Felicitaciones, has habilitado y usado sesiones en tu proyecto "ASP.NET Core"! Hay un par de métodos Get* y Set* adicionales para que uses, p.ej. GetInt32()/SetInt32() para enteros y Get()/Set() para matrices de bytes.
Sumario
Las sesiones pueden ser grandiosas para almacenar datos temporales entre multiples solicitudes en una sesión de navegación. Si necesitas almacenamiento más permanente, p.ej. a través de multiples sesiones, deberías usar cookies.