Guardar Objetos en Sesión ASP.Net Core MVC
En este post os voy a explicar como guardar Objetos en la sesión en un proyecto ASP.NET Core.
Lo primero que necesitamos hacer es crear un proyecto en el Visual Studio del tipo:
ASP.NET Core Web App(Model-View-Controller)
Una vez cargado nuestro Proyecto vamos a añadirle los siguientes Nugets:
El primer Nuget(Microsoft.AspNetCore.Session) es el que nos permite guardar información en la sesión pero esta información solo puede ser de tipo “string”.
Nosotros queremos guardar un objeto, para ello nos va ayudar el segundo Nuget(Newtonsoft.Json) que se va a encargar de “Serializar” y “Deserialzar” ese objeto.
Es decir que con ese Nuget podemos convertir el objeto en Json string y si hace falta volverlo a su tipado original.
Para ello debemos agregar una extension a la clase “ISession” debemos de seguir los siguentes pasos:
Sobre nuestro proyecto creamos una carpeta con el nombre “Extensions” y le añadimos una clase llamada “SessionExtension”
Primero tenemos que declarar nuestra clase como “static” para que no pueda ser instanciada. Lo que quiere decir que para acceder a esta clase utilizaremos directamente el nombre de la clase. Pero en nuestro caso es para extender las funcionalidades de la clase.
Dentro vamos a crear dos metodos para “Serializar” y “Deserializar” ambos “static» también.
El primer método vamos a llamarlo “SetObject” que nos permitirá transformar el objeto en “Json string” y guardarlo en la sesión.
En los parametros se indica que será una extensión de “ISession” y clave con su valor que es como funciona la sesisión.
Definimos “data” que es el valor que vamos a convertir en Json string y finalmente indicamos a la sesión que guarde una clave con ese valor.
El segundo método es para recuperar el objeto de la sesíon y lo llamaremos “GetObject”
Como se puede observar hay una “T” sirve para indicar el tipado del objeto que vamos a establecer o recuperar es decir si hemos guardado un objeto de tipo “List<>” tendremos que recuperarlo con el mismo tipo.
Indicamos la extensión y la clave dentro de los parametros.
Declaramos “data” para recuperar la sesión. Cuando usamos genericos no podemos devolver null por lo que tenemos que devolver el valor por defecto del tipo.
Y si es distinto a null, recuperamos el objeto con su respectivo tipado.
El código completo:
public static class SessionExtension
{
public static void SetObject(this ISession session, string key, object value)
{
string data = JsonConvert.SerializeObject(value);
session.SetString(key, data);
}
public static T GetObject<T>
(this ISession session, string key)
{
string data = session.GetString(key);
if (data == null)
{
return default(T);
}
else
{
return JsonConvert.DeserializeObject<T>(data);
}
}
}
A continuación, creamos un Controller que será encargado de guardar los objetos en la sesión.
Ya que disponemos de las extensiones, el código para guardar en la sesión es:
HttpContext.Session.SetObject(«Clave», valor);
Código para recuperar la sesión es:
HttpContext.Session.GetObject<TipoDeObjeto>(«Clave»);
En el siguiente ejemplo lo que estoy haciendo es crear una lista de objetos (Restaurante).
Si el id es distinto a nulo, busco un restaurante que quiero añadir mediante el id, creo la lista a la que voy a añadir los objetos, pero no la declaro, si ya hay objetos en la sesión, la lista se iguala a la lista de la sesión, se le añade el restaurante requerido y se establece de nuevo la sesión.
En caso contrario si no hay objetos en la lista, se declara la lista, se le añade el restaurante requerido y se establece la sesión.
public IActionResult GuardarSession(int idrest)
{
if (idrest != null)
{
Restaurante restaurante = this.repo.FindRestaurante(idrest);
List<Restaurante> restaurantesSession;
if (HttpContext.Session.GetObject<List<Restaurante>>(«ListaObjetos») != null)
{
restaurantesSession = HttpContext.Session.GetObject<List<Restaurante>>(«ListaObjetos»);
}
else
{
restaurantesSession = new List<Restaurante>();
}
restaurantesSession.Add(restaurante);
HttpContext.Session.SetObject(«ListaObjetos», restaurantesSession);
}
return RedirectToAction(«Index»);
}
Por último, queda resolver las dependencias en el archivo “Program.cs”.
Es obligatorio indicar el uso de la sesión mediante el siguiente código:
builder.Services.AddResponseCaching();
Sin esto la sesión funciona, pero solo en “LOCAL”. Es obligatorio añadirlo si nuestros proyectos serán publicados.
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
});
Indicamos el uso de la sesión y que el servicio se expira en 30 minutos.
Abajo del todo debemos utilizar el comando:
app.UseSession();
¡Es muy importante su posición!
Siempre se debe colocar encima de:
app.MapControllerRoute(
name: «default»,
pattern: «{controller=Home}/{action=Index}/{id?}»);
Con estos pasos ya podríamos guardar objetos en la sesión, para poder ver el código completo puedes descargarte el proyecto desde GitHub.
Autor: Nazar Romanyuk
Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma
Centro: Tajamar
Año académico: 2022-2023
Enlace a GitHub: https://github.com/NazarRom/SessionConObjetos.git