Debido a la naturaleza sin estado de la web, las sesiones también son una forma extremadamente útil de persistir objetos en las solicitudes serializándolos y almacenándolos en una sesión.
Un caso de uso perfecto de esto podría ser si necesita acceder a información regular a través de su aplicación, para guardar llamadas de base de datos adicionales en cada solicitud, estos datos se pueden almacenar en un objeto y no serializar en cada solicitud, así:
Nuestro objeto serializable y reutilizable:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Caso de uso:
public class LoginController : Controller {
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
var profileData = new UserProfileSessionData {
UserId = model.UserId,
EmailAddress = model.EmailAddress,
FullName = model.FullName
}
this.Session["UserProfile"] = profileData;
}
}
public ActionResult LoggedInStatusMessage()
{
var profileData = this.Session["UserProfile"] as UserProfileSessionData;
/* From here you could output profileData.FullName to a view and
save yourself unnecessary database calls */
}
}
Una vez que este objeto ha sido serializado, podemos usarlo en todos los controladores sin necesidad de crearlo o consultar la base de datos para obtener los datos que contiene nuevamente.
Inyecte su objeto de sesión usando Dependency Injection
En un mundo ideal, ' programaría en una interfaz, no en una implementación ' e inyectaría su objeto de sesión serializable en su controlador usando su contenedor de Inversión de Control de su elección, así (este ejemplo usa StructureMap ya que es con el que estoy más familiarizado ).
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Create new empty session object */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
Luego registraría esto en su Global.asax.cs
archivo.
Para aquellos que no están familiarizados con la inyección de objetos de sesión, pueden encontrar una publicación de blog más detallada sobre el tema aquí .
Una palabra de advertencia:
Vale la pena señalar que las sesiones deben mantenerse al mínimo, las sesiones grandes pueden comenzar a causar problemas de rendimiento.
También se recomienda no almacenar ningún dato sensible en ellos (contraseñas, etc.).