Ze względu na bezstanowy charakter sieci, sesje są również niezwykle użytecznym sposobem utrwalania obiektów w żądaniach poprzez ich serializację i przechowywanie w sesji.
Idealnym przypadkiem użycia może być to, że potrzebujesz dostępu do regularnych informacji w całej aplikacji, aby zapisać dodatkowe wywołania bazy danych przy każdym żądaniu, dane te mogą być przechowywane w obiekcie i nieserializowane przy każdym żądaniu, na przykład:
Nasz obiekt wielokrotnego użytku, możliwy do serializacji:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Przypadek użycia:
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 */
}
}
Po zserializowaniu tego obiektu możemy go używać na wszystkich kontrolerach bez konieczności tworzenia go lub ponownego wyszukiwania w bazie danych zawartych w nim danych.
Wstrzyknij obiekt sesji za pomocą Dependency Injection
W idealnym świecie `` zaprogramowałbyś interfejs, a nie implementację '' i wstrzyknął swój serializowalny obiekt sesji do kontrolera przy użyciu wybranego kontenera Inversion of Control (w tym przykładzie zastosowano StructureMap, ponieważ jest to ten, który najlepiej znam ).
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;
}
}
Następnie zarejestrujesz to w swoim Global.asax.cs
pliku.
Dla tych, którzy nie są zaznajomieni z wstrzykiwaniem obiektów sesji, możesz znaleźć bardziej szczegółowy wpis na blogu na ten temat tutaj .
Słowo ostrzeżenia:
Warto zauważyć, że sesje powinny być ograniczone do minimum, duże sesje mogą zacząć powodować problemy z wydajnością.
Zaleca się również, aby nie przechowywać w nich żadnych wrażliwych danych (haseł itp.).