En raison de la nature sans état du web, les sessions sont également un moyen extrêmement utile de persister des objets à travers les requêtes en les sérialisant et en les stockant dans une session.
Un cas d'utilisation parfait de ceci pourrait être si vous avez besoin d'accéder à des informations régulières à travers votre application, pour éviter des appels supplémentaires à la base de données à chaque requête, ces données peuvent être stockées dans un objet et désérialisées à chaque requête, comme ceci :
Notre objet réutilisable et sérialisable :
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Cas d'utilisation :
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;
/* À partir de là, vous pourriez afficher profileData.FullName dans une vue et
éviter des appels inutiles à la base de données */
}
}
Une fois cet objet sérialisé, nous pouvons l'utiliser à travers tous les contrôleurs sans avoir besoin de le recréer ou de consulter à nouveau la base de données pour les données qu'il contient.
Injectez votre objet session en utilisant l'injection de dépendances
Dans un monde idéal, vous devriez 'programmer face à une interface, pas à une implémentation' et injecter votre objet de session sérialisable dans votre contrôleur en utilisant votre conteneur d'Inversion de Contrôle préféré, comme ceci (cet exemple utilise StructureMap car c'est celui avec lequel je suis le plus familier).
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Créer un nouvel objet de session vide */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
Vous devrez ensuite enregistrer ceci dans votre fichier Global.asax.cs
.
Pour ceux qui ne sont pas familiers avec l'injection d'objets de session, vous pouvez trouver un article de blog plus détaillé sur le sujet ici.
Un avertissement :
Il convient de noter que les sessions doivent être maintenues au minimum, des sessions volumineuses peuvent commencer à causer des problèmes de performance.
Il est également recommandé de ne pas y stocker de données sensibles (mots de passe, etc).
2 votes
Possible duplicate de Comment maintenir la session utilisateur avec ASP.NET MVC
2 votes
Cet article pourrait vous intéresser : brockallen.com/2012/04/07/think-twice-about-using-session-state