(Diperbarui untuk kelengkapan)
Anda dapat mengakses variabel sesi dari halaman mana pun atau mengontrol menggunakan Session["loginId"]
dan dari kelas apa pun (misalnya dari dalam perpustakaan kelas), menggunakanSystem.Web.HttpContext.Current.Session["loginId"].
Tapi tolong baca terus untuk jawaban asli saya ...
Saya selalu menggunakan kelas wrapper di sekitar sesi ASP.NET untuk menyederhanakan akses ke variabel sesi:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Kelas ini menyimpan satu instance dari dirinya sendiri di sesi ASP.NET dan memungkinkan Anda untuk mengakses properti sesi Anda dengan cara yang aman dari kelas apa pun, misalnya seperti ini:
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
Pendekatan ini memiliki beberapa keuntungan:
- itu menyelamatkan Anda dari banyak jenis casting
- Anda tidak harus menggunakan kunci sesi kode keras di seluruh aplikasi Anda (mis. Sesi ["loginId"]
- Anda dapat mendokumentasikan item sesi Anda dengan menambahkan komentar dokumen XML pada properti MySession
- Anda dapat menginisialisasi variabel sesi Anda dengan nilai default (mis. memastikan mereka bukan nol)
Akses Sesi melalui utas HttpContext: -
sumber
Masalah dengan solusi yang disarankan adalah ia dapat memecah beberapa fitur kinerja yang dibangun ke dalam SessionState jika Anda menggunakan penyimpanan sesi yang tidak dalam proses. ("Mode Server Negara" atau "Mode SQL Server"). Dalam mode oop, data sesi perlu diserialisasi pada akhir permintaan halaman dan deserialized pada awal permintaan halaman, yang bisa mahal. Untuk meningkatkan kinerja, SessionState berupaya untuk hanya melakukan deserialisasi apa yang diperlukan oleh hanya variabel deserialisasi ketika diakses pertama kali, dan hanya menserialisasi ulang dan mengganti variabel yang diubah. Jika Anda memiliki banyak variabel sesi dan mendorong semuanya menjadi satu kelas, pada dasarnya semua yang ada di sesi Anda akan di-deserialisasi pada setiap permintaan halaman yang menggunakan sesi dan semuanya perlu diserialisasi lagi walaupun hanya 1 properti yang diubah karena kelas diubah. Hanya sesuatu yang perlu dipertimbangkan jika Anda menggunakan banyak sesi dan mode oop.
sumber
Jawaban yang disajikan sebelum saya memberikan solusi tepat untuk masalah ini, namun, saya merasa penting untuk memahami mengapa hasil kesalahan ini:
The
Session
milikPage
mengembalikan sebuah instance dari jenisHttpSessionState
relatif terhadap permintaan tertentu.Page.Session
sebenarnya setara dengan meneleponPage.Context.Session
.MSDN menjelaskan bagaimana ini mungkin:
Namun, ketika Anda mencoba mengakses properti ini dalam suatu kelas di App_Code, properti itu tidak akan tersedia untuk Anda kecuali kelas Anda berasal dari Kelas Halaman.
Solusi saya untuk skenario yang sering ditemui ini adalah bahwa saya tidak pernah melewatkan objek halaman ke kelas . Saya lebih suka mengekstrak objek yang diperlukan dari halaman Session dan meneruskannya ke Kelas dalam bentuk koleksi nilai-nama / Array / Daftar, tergantung pada kasusnya.
sumber
Saya memiliki kesalahan yang sama, karena saya mencoba memanipulasi variabel sesi di dalam kelas Sesi kustom.
Saya harus meneruskan konteks saat ini (system.web.httpcontext.current) ke dalam kelas, dan kemudian semuanya berjalan dengan baik.
MA
sumber
Dalam inti asp.net ini berfungsi berbeda:
Sumber: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
sumber
Ini harus lebih efisien baik untuk aplikasi dan juga untuk pengembang.
Tambahkan kelas berikut ke proyek web Anda:
Berikut implementasinya:
sumber