Aufgrund der Statuslosigkeit des Webs sind Sitzungen auch eine äußerst nützliche Methode, um Objekte über Anforderungen hinweg zu persistieren, indem sie serialisiert und in einer Sitzung gespeichert werden.
Ein perfekter Anwendungsfall hierfür könnte sein, wenn Sie auf reguläre Informationen in Ihrer Anwendung zugreifen müssen, um zusätzliche Datenbankaufrufe bei jeder Anforderung zu speichern. Diese Daten können in einem Objekt gespeichert und bei jeder Anforderung unserialisiert werden, wie folgt:
Unser wiederverwendbares, serialisierbares Objekt:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Anwendungsfall:
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 */
}
}
Sobald dieses Objekt serialisiert wurde, können wir es auf allen Controllern verwenden, ohne es erstellen oder die Datenbank erneut nach den darin enthaltenen Daten abfragen zu müssen.
Injizieren Sie Ihr Sitzungsobjekt mit Dependency Injection
In einer idealen Welt würden Sie " auf eine Schnittstelle programmieren, nicht implementieren " und Ihr serialisierbares Sitzungsobjekt mithilfe des von Ihnen gewählten Inversion of Control-Containers in Ihren Controller einfügen (in diesem Beispiel wird StructureMap verwendet, wie ich es am besten kenne ).
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;
}
}
Sie würden dies dann in Ihrer Global.asax.cs
Datei registrieren .
Für diejenigen , die mit dem Einspritzen Sitzungsobjekte nicht vertraut sind, können Sie eine tiefer gehende Blog - Post über das Thema finden Sie hier .
Ein Wort der Warnung:
Es ist erwähnenswert, dass Sitzungen auf ein Minimum beschränkt werden sollten. Große Sitzungen können Leistungsprobleme verursachen.
Es wird auch empfohlen, keine vertraulichen Daten (Kennwörter usw.) darin zu speichern.