Karena sifat web yang tidak memiliki kewarganegaraan, sesi juga merupakan cara yang sangat berguna untuk mempertahankan objek di seluruh permintaan dengan menserialisasinya dan menyimpannya dalam satu sesi.
Contoh penggunaan yang sempurna dari hal ini adalah jika Anda perlu mengakses informasi reguler di seluruh aplikasi Anda, untuk menyimpan panggilan database tambahan pada setiap permintaan, data ini dapat disimpan dalam sebuah objek dan tidak diserialisasikan pada setiap permintaan, seperti:
Objek kami yang dapat digunakan kembali dan dapat diserialkan:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Kasus penggunaan:
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 */
}
}
Setelah objek ini telah diserialisasi, kita dapat menggunakannya di semua pengontrol tanpa perlu membuatnya atau meminta database untuk data yang ada di dalamnya lagi.
Suntikkan objek sesi Anda menggunakan Injeksi Ketergantungan
Dalam dunia yang ideal Anda akan ' memprogram ke antarmuka, bukan implementasi ' dan menyuntikkan objek sesi yang dapat diserialkan ke pengontrol Anda menggunakan wadah Inversion of Control pilihan Anda, seperti itu (contoh ini menggunakan StructureMap karena itu yang paling saya kenal ).
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;
}
}
Anda kemudian akan mendaftarkan ini di Global.asax.cs
file Anda .
Bagi mereka yang tidak terbiasa dengan menyuntikkan objek sesi, Anda dapat menemukan entri blog yang lebih mendalam tentang subjek di sini .
Sebuah kata peringatan:
Perlu dicatat bahwa sesi harus diminimalkan, sesi besar dapat mulai menyebabkan masalah kinerja.
Juga disarankan untuk tidak menyimpan data sensitif apa pun di dalamnya (kata sandi, dll).