Apa perbedaan antara Session.Abandon () dan Session.Clear ()

109

Apa perbedaan antara menghancurkan sesi dan menghapus nilainya? Bisakah Anda memberikan contoh yang menunjukkan hal ini?

Saya mencari pertanyaan ini, tetapi tidak menangkap jawaban total. Beberapa jawabannya adalah:

  • Session.Abandon() menghancurkan sesi
  • Session.Clear() hanya menghapus semua nilai

Seorang teman memberi tahu saya ini:

Menghapus sesi tidak akan menghapus sesi, itu masih ada dengan ID yang sama untuk pengguna tetapi dengan nilai yang sudah dihapus.

Pengabaian akan menghancurkan sesi sepenuhnya, artinya Anda perlu memulai sesi baru sebelum Anda dapat menyimpan nilai lainnya di sesi untuk pengguna tersebut.

Kode di bawah ini berfungsi dan tidak memberikan pengecualian apa pun.

Session.Abandon();
Session["tempKey1"] = "tempValue1";

Ketika Anda Abandon () a Session, Anda (atau lebih tepatnya pengguna) akan mendapatkan SessionId baru

Saat saya menguji Sesi, tidak ada perubahan apa pun saat Saya Mengabaikan sesi.

Saya hanya menemukan satu perbedaan: session.Abandon()mengangkat Session_Endacara

pintu belakang
sumber
5
Session.Clear menghapus item segera tetapi Session.Abandon menandai sesi yang akan ditinggalkan pada akhir permintaan saat ini.
RepDbg

Jawaban:

147

Hapus - Menghapus semua kunci dan nilai dari kumpulan status sesi.

Abaikan - menghapus semua objek yang disimpan dalam Sesi. Jika Anda tidak memanggil metode Abaikan secara eksplisit, server akan menghapus objek ini dan menghancurkan sesi saat sesi habis waktu.
Itu juga memunculkan acara seperti Session_End .

Session.Clear bisa diibaratkan membuang semua buku dari rak , sedangkan Session.Abandon lebih seperti membuang seluruh rak .

Kamu bilang:

Saat saya menguji Sesi, tidak ada perubahan apa pun saat Saya Mengabaikan sesi.

Ini benar saat Anda melakukannya hanya dalam satu permintaan .
Pada permintaan berikutnya, sesi akan berbeda. Tapi ID sesi bisa digunakan kembali sehingga id akan tetap sama.

Jika Anda akan menggunakan Session.Clear, Anda akan memiliki sesi yang sama di banyak permintaan.

Umumnya, dalam banyak kasus, Anda perlu menggunakan Session.Clear.
Anda dapat menggunakan Session.Abandon jika Anda yakin pengguna akan meninggalkan situs Anda.

Jadi kembali ke perbedaannya:

  1. Abaikan akan memunculkan permintaan Session_End.
  2. Hapus menghapus item segera, Abaikan tidak.
  3. Abandon melepaskan objek SessionState dan itemnya sehingga bisa membuang sampah yang dikumpulkan untuk membebaskan sumber daya. Clear membuat SessionState dan sumber daya terkait dengannya.
Dmytrii Nagirniak
sumber
dan jika saya memanggil session.clear () ini Anda mengatakannya lagi. tidak? (semuanya meningkatkan acara Session_End)
pintu belakang
Session.Clear hanya akan menghapus item dari Session. Tidak ada lagi. Anda dapat memanggilnya sebanyak yang Anda butuhkan.
Dmytrii Nagirniak
@AnthonyWJones, Anda benar "menghancurkan" tidak benar untuk dikatakan. Lebih baik HAPUS objek dari sesi. Tapi Session.Clear juga tidak menghancurkan objek, itu menghapus mereka dari sesi sehingga mereka bisa sampah dikumpulkan. Juga, menyimpan objek COMPLEX tidak disarankan, jika tidak, saya menganggapnya baik-baik saja.
Dmytrii Nagirniak
@Dmitriy: Mengapa "menyimpan objek COMPLEX tidak disarankan"?
Kamarey
5
@Iklan Saya setuju, meskipun saya akan memperpanjangnya dengan mengatakan itu Session.Cleardapat dibandingkan dengan menghapus semua buku dari rak segera , sementara Session.Abandonlebih seperti mengatakan "buang seluruh rak dan beri tahu saya ketika Anda selesai ".
WynandB
20

Saat Anda Abandon()menjadi Sesi, Anda (atau lebih tepatnya pengguna) akan mendapatkan SessionId baru (pada permintaan berikutnya). Saat Anda Clear()menjadi Sesi, semua nilai yang disimpan akan dihapus, tetapi SessionId tetap utuh.

Hans Ke st ing
sumber
3
Terima kasih. tetapi menurut buku mattew macdonalds itu dapat menggunakan id sesi yang sama. maksud saya jika atribut regenerateExpiredSessionId di konfigurasi / system.web / sessionState elemen di file web.config salah ASP.Net menggunakan id sesi lama
pintu belakang
2
@Hans Kesting Dia tidak akan mendapatkan ID Sesi baru saat panggilan ditinggalkan. Dia harus secara eksplisit menyetel cookie ASPNET_SessionID ke null untuk mendapatkan ID Sesi baru.
Zo Memiliki
9

Ini semacam tercakup oleh berbagai tanggapan di atas, tetapi pertama kali saya membaca artikel ini, saya melewatkan fakta penting, yang menyebabkan bug minor dalam kode saya ...

Session.Clear() akan MENGHAPUS nilai dari semua kunci tetapi TIDAK akan menyebabkan peristiwa akhir sesi diaktifkan.

Session.Abandon()TIDAK akan menghapus nilai pada permintaan saat ini. JIKA halaman lain diminta, nilainya akan hilang untuk halaman itu. Namun, meninggalkan AKAN membuang acara tersebut.

Jadi, dalam kasus saya (dan mungkin dalam kasus Anda?), Saya perlu Clear()diikuti Abandon().

NRC
sumber
1
Mengapa Anda membutuhkan Session.Clear () diikuti oleh Session.Abandon ()? Anda menghapus nilai dari koleksi yang Anda hancurkan? Ini benar-benar berlebihan. Tentu objek sesi tidak langsung dimusnahkan (yang terjadi di akhir permintaan saat ini), tetapi id sesi tersebut tidak akan lagi disajikan oleh permintaan berikutnya. Jika klien membuat permintaan baru, sesi baru akan diberikan kepada mereka. Memanggil Hapus terlebih dahulu juga akan menyebabkan masalah jika Anda ingin mengakses variabel sesi apa pun di acara Session_End () dari Global.Asax (mereka tidak akan ada di sana karena Anda menghapusnya).
RepDbg
@RepDbg sebenarnya saya tidak setuju. Session.Abandon (). memberi klien id sesi baru. Session.clear menghapus semua info di server tentang sesi sehingga tidak ada pengguna lain yang bisa. Saya setuju dengan NRC
Micah Armantrout
@ Mikha Armantrout Saya tidak mengikuti logika Anda. Mengapa menghapus sesi dengan Session.Clear (), lalu memanggil Session.Abandon () yang tidak hanya menghapus sesi, tetapi juga membatalkan alokasinya sepenuhnya? Juga Session.Abandon () tidak memberi klien id sesi baru. Permintaan berikutnya akan, tetapi bukan pemenuhan permintaan yang disebut Session.Abandon ().
RepDbg
Jika Anda hanya menggunakan Session.Abandon, logika lain yang tersisa di pipeline ASP.NET masih dapat mengakses nilai sesi saat ini.
Mark Sowul
6

kode ini berfungsi dan jangan melempar pengecualian apa pun:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

Itu karena ketika metode Abandon dipanggil, objek Session saat ini diantrekan untuk dihapus tetapi tidak benar-benar dihapus sampai semua perintah skrip pada halaman saat ini telah diproses. Artinya, Anda dapat mengakses variabel yang disimpan di objek Session di halaman yang sama dengan panggilan ke metode Abandon, tetapi tidak di halaman Web berikutnya.

Misalnya, dalam skrip berikut, baris ketiga mencetak nilai Mary. Ini karena objek Sesi tidak dihancurkan hingga server selesai memproses skrip.

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

Jika Anda mengakses variabel MyName di halaman Web berikutnya, itu kosong. Ini karena MyName dihancurkan dengan objek Sesi sebelumnya ketika halaman yang berisi contoh sebelumnya selesai diproses.

dari MSDN Session.Abandon

Tujuh
sumber
3

Mengosongkan sesi menghapus nilai yang disimpan di sana, tetapi Anda masih dapat menambahkan yang baru di sana. Setelah menghancurkan sesi, Anda tidak dapat menambahkan nilai baru di sana.

RaYell
sumber
terima kasih tetapi ini berhasil: (tidak sesuai dengan ide Anda) Session.Abandon (); Sesi ["tempKey1"] = "tempValue1"; Response.Write (Sesi ["tempKey1"]. ToString ());
pintu belakang
Itu terjadi karena sesi akan dihancurkan setelah Anda menyegarkan halaman Anda sebenarnya. ID sesi itu (biasanya) disimpan dalam cookie.
RaYell
Saya tidak mengerti. Maksud saya setelah saya memanggil Session.Abandon () masih saya dapat menambahkan nilai padanya. (bahkan jika halaman diposting kembali dan dirender lagi).
pintu belakang
1
Anda mungkin meminta sesi Anda disetel untuk membuat id otomatis setelah dihancurkan. Jadi, ketika Anda menetapkan nilai ke sesi yang dihancurkan, sesi baru akan dibuat secara otomatis.
RaYell
1
ya, menggunakan id sesi ini akan membuat ulang tetapi pertanyaan saya adalah: apa perbedaan antara session.clear () dan session.abandone () sama sekali. dengan cara ini ketika autoregenerate disetel ke false, deretan ini tidak berbeda dalam hal lain yang meningkatkan Sesion_End?
pintu belakang
3

hapus kunci atau nilai hapus dari kumpulan status sesi ..

abaikan-nya menghapus atau menghapus objek sesi dari sesi ..

maxy
sumber
1
Session.Abandon() 

akan menghancurkan / mematikan seluruh sesi.

Session.Clear()

menghapus / membersihkan data sesi (yaitu kunci dan nilai dari sesi saat ini) tetapi sesi akan hidup.

Bandingkan dengan metode Session.Abandon (), Session.Clear () tidak membuat sesi baru, itu hanya membuat semua variabel dalam sesi menjadi NULL.

ID Sesi akan tetap sama dalam kedua kasus tersebut, selama browser tidak ditutup.

Session.RemoveAll()

Ini menghapus semua kunci dan nilai dari kumpulan status sesi.

Session.Remove()

Ini menghapus item dari koleksi status sesi.

Session.RemoveAt()

Ini menghapus item pada indeks tertentu dari kumpulan status sesi.

Session.TimeOut()

Properti ini menentukan periode waktu habis yang ditetapkan ke objek Sesi untuk aplikasi. (waktu akan ditentukan dalam menit).

Jika pengguna tidak menyegarkan atau meminta halaman dalam periode waktu habis, sesi akan berakhir.

Laxmi
sumber
0

Saya pikir akan lebih berguna untuk digunakan Session.Clear()daripada menggunakan Session.Abandon().

Karena nilai-nilai masih ada di sesi setelah memanggil nanti tetapi dihapus setelah memanggil sebelumnya.

Pra
sumber
0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

Satu hal yang perlu diperhatikan di sini bahwa Session.Clear menghapus item dengan segera tetapi Session.Abandon menandai sesi untuk ditinggalkan pada akhir permintaan saat ini. Artinya, misalkan Anda mencoba mengakses nilai dalam kode tepat setelah perintah session.abandon dijalankan, nilai itu akan tetap ada. Jadi jangan bingung jika kode Anda tidak berfungsi bahkan setelah mengeluarkan perintah session.abandon dan segera melakukan beberapa logika dengan sesi tersebut.

Biki
sumber