Apa yang harus saya lakukan jika sesi ASP.NET saat ini nol?

125

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.Sessionnol?

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?
}
Anthony
sumber
ASP.NET WebApi akan memiliki perilaku yang berbeda, Anda dapat memeriksanya di Mengakses Sesi Menggunakan ASP.NET Web API
Tiago Gouvêa

Jawaban:

158

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.

driis
sumber
6
Hanya pembaruan cepat yang saya temukan hari ini. Sesi tidak tersedia di pembuat halaman! Hanya di acara Init atau setelah itu.
Nuno Agapito
Saya baru saja menemukan HttpContext.Current.Session == null adalah kode yang dipanggil oleh acara Page_Load dari halaman master. Rupanya, ini bisa terjadi dalam konteks halaman. Jika saya memeriksa objek HttpContext.Current, sebagian besar anggotanya diinisialisasi, tetapi CurrentNotification dan IsPostNotification membuat kesalahan: {System.PlatformNotSupportedException}. Apapun penyebabnya, masalah ini tidak pernah terjadi dalam produksi, yang sudah berjalan bertahun-tahun. Platformnya adalah Windows Server 2003 R2 SP2, aplikasi memiliki kerangka kerja target .Net 3.5 dan berjalan di IIS dengan status sesi diaktifkan.
R. Schreurs
Saya juga menemukan bahwa, ketika IIS melayani permintaan langsung untuk file sumber daya yang ada di disk, seperti lembar gaya, HttpContext.Current.Sessiondapat 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.
ingredient_15939
Saya pikir itu juga bisa menjadi null jika Anda berada di dalam tindakan MVC output-cache.
pengguna2173353
40

Pernyataan berikut tidak sepenuhnya akurat:

"Jadi jika Anda memanggil fungsi lain, termasuk kelas statis, dari halaman Anda, Anda akan baik-baik saja"

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:

Namun ada trik, untuk mengakses status sesi dalam metode web, Anda harus mengaktifkan manajemen status sesi seperti ini:

[WebMethod (EnableSession = true)]

Dengan menentukan nilai EnableSession, Anda sekarang akan memiliki sesi terkelola untuk dimainkan. Jika Anda tidak menentukan nilai ini, Anda akan mendapatkan objek Sesi nol, dan kemungkinan besar akan mengalami pengecualian referensi nol saat mencoba mengakses objek sesi.

Terima kasih kepada Matthew Cozier untuk solusinya.

Hanya berpikir saya akan menambahkan dua sen saya.

Ed

Ed Bishop
sumber
1
terima kasih Ed, Sesi muncul sebagai null dalam metode web - menambahkan ini memperbaikinya. +1
fusi
1
Nah, saat Anda menelepon ke layanan web, Anda menggunakan permintaan lain selain untuk halaman tersebut, sehingga pernyataan itu masih benar, IMO.
driis
Dokumen MSDN di sini - the default value is false. Bekerja seperti pesona.
Benjineer
22

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 #):

public class MyAshxClass : IHttpHandler, IRequiresSessionState
mathijsuitmegen
sumber
Terima kasih banyak, sesi di kelas login saya nol. Ketika saya menambahkan kode ini ke penangan ashx saya, sesi itu juga berubah di kelas saya
Ateş Danış
Saya pikir ini menjawab pertanyaan dengan cukup baik. Terima kasih banyak.
Sachin Joseph
2

Artikel Teknis ASP.NET

RINGKASAN: Di ASP.NET, setiap halaman Web berasal dari kelas System.Web.UI.Page. Kelas Halaman mengumpulkan sebuah instance dari objek HttpSession untuk data sesi. Kelas Halaman memperlihatkan berbagai peristiwa dan metode untuk penyesuaian. Secara khusus, metode OnInit digunakan untuk mengatur status inisialisasi objek Halaman. Jika permintaan tidak memiliki cookie Sesi, cookie Sesi baru akan dikeluarkan untuk pemohon.

EDIT:

Sesi: Konsep untuk Pemula

RINGKASAN: Sesi dibuat ketika pengguna mengirim permintaan pertama ke server untuk halaman mana pun di aplikasi web, aplikasi membuat Sesi dan mengirimkan ID Sesi kembali ke pengguna dengan respons dan disimpan di mesin klien sebagai cookie kecil . Jadi idealnya "mesin yang telah menonaktifkan cookie, informasi sesi tidak akan disimpan".

adatapost
sumber
2

Dalam kasus saya ASP.NET State Servicedihentikan. Mengubah Startup typeke Automaticdan memulai layanan secara manual untuk pertama kalinya menyelesaikan masalah.

Eric
sumber