A causa della natura senza stato del web, le sessioni sono anche un modo estremamente utile per rendere persistenti gli oggetti tra le richieste serializzandoli e memorizzandoli in una sessione.
Un caso d'uso perfetto di questo potrebbe essere se è necessario accedere a informazioni regolari attraverso l'applicazione, per salvare ulteriori chiamate al database su ogni richiesta, questi dati possono essere memorizzati in un oggetto e non serializzati su ogni richiesta, in questo modo:
Il nostro oggetto riutilizzabile e serializzabile:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Caso d'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 volta che questo oggetto è stato serializzato, possiamo usarlo su tutti i controller senza doverlo creare o interrogare nuovamente il database per i dati in esso contenuti.
Inietta il tuo oggetto sessione utilizzando Dependency Injection
In un mondo ideale dovresti ' programmare su un'interfaccia, non sull'implementazione ' e iniettare il tuo oggetto di sessione serializzabile nel tuo controller usando il tuo contenitore Inversion of Control preferito, in questo modo (questo esempio usa StructureMap poiché è quello con cui ho più familiarità ).
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;
}
}
Dovresti quindi registrarlo nel tuo Global.asax.cs
file.
Per coloro che non hanno familiarità con l'inserimento di oggetti di sessione, è possibile trovare un post di blog più approfondito sull'argomento qui .
Una parola di avvertimento:
Vale la pena notare che le sessioni dovrebbero essere ridotte al minimo, sessioni di grandi dimensioni possono iniziare a causare problemi di prestazioni.
Si consiglia inoltre di non archiviare dati sensibili (password, ecc.).