Dalam aplikasi web saya, saya melakukan sesuatu seperti ini untuk membaca variabel sesi:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Saya mengerti mengapa penting untuk memeriksa mengapa HttpContext.Current.Session ["MyVariable"] adalah null (variabel mungkin belum disimpan dalam Sesi atau Sesi telah disetel ulang karena berbagai alasan), tetapi mengapa saya perlu memeriksa jika HttpContext.Current.Session
nol?
Pemahaman saya adalah bahwa sesi dibuat secara otomatis oleh ASP.NET oleh karena itu HttpContext.Current.Session tidak boleh null. Apakah asumsi ini benar? Jika bisa nol, apakah itu berarti saya juga harus memeriksanya sebelum menyimpan sesuatu di dalamnya:
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
// What should be done in this case (if session is null)?
// Is it possible to force the session to be created if it doesn't exist?
}
Jawaban:
Ya, objek Session mungkin kosong, tetapi hanya dalam keadaan tertentu, yang jarang Anda temui:
Jika Anda hanya memiliki kode di halaman, Anda tidak akan menemukan ini. Sebagian besar kode ASP .NET saya menggunakan Sesi tanpa memeriksa null berulang kali. Namun, ini adalah sesuatu yang perlu dipikirkan jika Anda mengembangkan IHttpModule atau sebaliknya ada di detail yang lebih kasar dari ASP .NET.
Sunting
Sebagai jawaban atas komentar: Apakah status sesi tersedia atau tidak bergantung pada apakah peristiwa AcquireRequestState telah berjalan untuk permintaan tersebut. Di sinilah modul status sesi bekerja dengan membaca cookie sesi dan menemukan set variabel sesi yang sesuai untuk Anda.
AcquireRequestState berjalan sebelum kontrol diserahkan ke Halaman Anda. Jadi jika Anda memanggil fungsionalitas lain, termasuk kelas statis, dari halaman Anda, Anda akan baik-baik saja.
Jika Anda memiliki beberapa kelas yang melakukan logika inisialisasi selama permulaan, misalnya pada acara Application_Start atau dengan menggunakan konstruktor statis, status Sesi mungkin tidak tersedia. Semuanya bermuara pada apakah ada permintaan saat ini dan AcquireRequestState telah dijalankan.
Selain itu, jika klien telah menonaktifkan cookie, objek Sesi akan tetap tersedia - tetapi pada permintaan berikutnya, pengguna akan kembali dengan Sesi kosong yang baru. Ini karena klien diberi statebag Sesi jika dia belum memilikinya. Jika klien tidak mengirimkan cookie sesi, kami tidak memiliki cara untuk mengidentifikasi klien sebagai klien yang sama, jadi dia akan diberikan sesi baru lagi dan lagi.
sumber
HttpContext.Current.Session
dapat bernilai nol untuk kode di `Application_AcquireRequestState '. Permintaan untuk halaman itu sendiri, bagaimanapun, membuat objek sesi tersedia untuk kode di sana. Ini setidaknya di bawah MVC.NET 4.Pernyataan berikut tidak sepenuhnya akurat:
Saya memanggil metode statis yang mereferensikan sesi melalui HttpContext.Current.Session dan nilainya null. Namun, saya memanggil metode melalui metode webservice melalui ajax menggunakan jQuery.
Seperti yang saya temukan di sini, Anda dapat memperbaiki masalah dengan atribut sederhana pada metode, atau menggunakan objek sesi layanan web:
Terima kasih kepada Matthew Cozier untuk solusinya.
Hanya berpikir saya akan menambahkan dua sen saya.
Ed
sumber
the default value is false
. Bekerja seperti pesona.Jika instance Session Anda null dan Anda dalam file 'ashx', cukup terapkan antarmuka 'IRequiresSessionState'.
Antarmuka ini tidak memiliki anggota jadi Anda hanya perlu menambahkan nama antarmuka setelah deklarasi kelas (C #):
sumber
Artikel Teknis ASP.NET
EDIT:
Sesi: Konsep untuk Pemula
sumber
Dalam kasus saya
ASP.NET State Service
dihentikan. MengubahStartup type
keAutomatic
dan memulai layanan secara manual untuk pertama kalinya menyelesaikan masalah.sumber