Manakah cara termudah dan paling tidak mengganggu untuk menjaga sesi ASP.NET tetap hidup selama pengguna membuka jendela browser? Apakah itu panggilan AJAX berjangka waktu? Saya ingin mencegah hal berikut: terkadang pengguna membiarkan jendelanya terbuka untuk waktu yang lama, lalu memasukkan barang, dan saat mengirimkan tidak ada yang berfungsi lagi karena sesi sisi server kedaluwarsa. Saya tidak ingin meningkatkan nilai batas waktu selama lebih dari 10 menit di server karena saya ingin sesi tertutup (dengan menutup jendela browser) untuk waktu habis dengan cepat.
Saran, contoh kode?
Jawaban:
Saya menggunakan JQuery untuk melakukan panggilan AJAX sederhana ke Handler HTTP tiruan yang tidak melakukan apa pun selain menjaga Sesi saya tetap hidup:
Penangan sesi bisa sesederhana:
Kuncinya adalah menambahkan IRequiresSessionState, jika tidak Sesi tidak akan tersedia (= null). Penangan tentu saja juga dapat mengembalikan objek serial JSON jika beberapa data harus dikembalikan ke JavaScript pemanggil.
Tersedia melalui web.config:
ditambahkan dari balexandre pada 14 Agustus 2012
Saya sangat menyukai contoh ini, sehingga saya ingin meningkatkan dengan HTML / CSS dan bagian beat
ubah ini
ke
dan tambahkan
HTML dan CSS
berikut adalah contoh langsung hanya untuk bagian pemukulan: http://jsbin.com/ibagob/1/
sumber
DateTime.Now
hanya untuk membuatnya jelas kapan sesi terakhir diperbarui melalui detak jantung.Jika Anda menggunakan ASP.NET MVC - Anda tidak memerlukan penangan HTTP tambahan dan beberapa modifikasi pada file web.config. Yang Anda butuhkan - cukup tambahkan beberapa tindakan sederhana di pengontrol Rumah / Umum:
, tulis kode JavaScript seperti ini (saya telah meletakkannya di salah satu file JavaScript situs):
, dan menginisialisasi fungsionalitas ini dengan memanggil fungsi JavaScript:
Tolong dicatat! Saya telah menerapkan fungsi ini hanya untuk pengguna yang berwenang (dalam banyak kasus tidak ada alasan untuk mempertahankan status sesi untuk tamu) dan keputusan untuk tetap mengaktifkan status sesi tidak hanya berdasarkan - apakah browser terbuka atau tidak, tetapi pengguna yang berwenang harus melakukan beberapa aktivitas di situs (gerakkan mouse atau ketik beberapa tombol).
sumber
@Url.Action("KeepSessionAlive","Home")
fungsi penginisialisasi sehingga Anda tidak perlu melakukan hardcode URL dan juga membuang blok pertama di dalam IIFE dan hanya mengekspornyaSetupSessionUpdater
karena itulah satu-satunya hal yang perlu dipanggil secara eksternal - sesuatu seperti ini: SessionUpdater.jssetInterval(KeepSessionAlive, 300000)
Setiap kali Anda membuat permintaan ke server, batas waktu sesi disetel ulang. Jadi Anda bisa membuat panggilan ajax ke penangan HTTP kosong di server, tapi pastikan cache penangan dinonaktifkan, jika tidak browser akan men-cache penangan Anda dan tidak akan membuat permintaan baru.
KeepSessionAlive.ashx.cs
.JS:
@veggerby - Tidak perlu overhead penyimpanan variabel dalam sesi. Hanya melakukan permintaan terlebih dahulu ke server sudah cukup.
sumber
Apakah Anda benar-benar perlu mempertahankan sesi (apakah Anda memiliki data di dalamnya?) Atau apakah cukup untuk memalsukan ini dengan memulihkan sesi saat ada permintaan? Kalau dulu, gunakan cara di atas. Jika yang kedua, coba sesuatu seperti menggunakan event handler Session_End.
Jika Anda memiliki Autentikasi Formulir, maka Anda mendapatkan sesuatu di Global.asax.cs seperti
Dan Anda menetapkan masa pakai tiket lebih lama dari masa pakai sesi. Jika Anda tidak mengautentikasi, atau menggunakan metode autentikasi yang berbeda, ada trik serupa. Antarmuka web Microsoft TFS dan SharePoint tampaknya menggunakan ini - manfaatnya adalah jika Anda mengklik tautan pada halaman basi, Anda mendapatkan petunjuk otentikasi di jendela popup, tetapi jika Anda hanya menggunakan perintah, itu berfungsi.
sumber
Anda bisa menulis kode ini di file java script itu saja.
Waktu
(20-1)*60*1000
penyegaran, itu akan menyegarkan waktu tunggu sesi. Refresh timeout dihitung sebagai waktu default keluar dari iis = 20 menit, berarti 20 × 60000 = 1200000 milidetik - 60000 milidetik (Satu menit sebelum sesi berakhir) adalah 1140000.sumber
Berikut adalah solusi alternatif yang akan bertahan jika pc klien masuk ke mode tidur.
Jika Anda memiliki sejumlah besar pengguna yang login, gunakan ini dengan hati-hati karena ini dapat memakan banyak memori server.
Setelah Anda masuk (saya melakukan ini di acara LoggedIn pada kontrol login)
sumber
Saya menghabiskan beberapa hari mencoba mencari cara untuk memperpanjang sesi pengguna di WebForms melalui dialog popup yang memberi pengguna opsi untuk memperbarui sesi atau membiarkannya berakhir. Hal # 1 yang perlu Anda ketahui adalah bahwa Anda tidak memerlukan hal-hal 'HttpContext' yang mewah ini terjadi di beberapa jawaban lainnya. Yang Anda butuhkan hanyalah $ .post () dari jQuery; metode. Misalnya, saat men-debug saya menggunakan:
dan di situs langsung Anda, Anda akan menggunakan sesuatu seperti:
Semudah itu. Selain itu, jika Anda ingin meminta pengguna dengan opsi untuk memperbarui sesi mereka, lakukan sesuatu yang mirip dengan berikut ini:
Jangan lupa untuk menambahkan Dialog ke html Anda:
sumber
Berkenaan dengan solusi veggerby, jika Anda mencoba menerapkannya di aplikasi VB, berhati-hatilah saat mencoba menjalankan kode yang disediakan melalui penerjemah. Berikut ini akan bekerja:
Selain itu, alih-alih memanggil fungsi seperti heartbeat ():
Sebaliknya, sebut saja seperti:
Pertama, setTimeout hanya diaktifkan sekali sedangkan setInterval akan diaktifkan berulang kali. Kedua, memanggil detak jantung () seperti string tidak berfungsi untuk saya, sedangkan memanggilnya seperti fungsi sebenarnya.
Dan saya benar-benar dapat 100% mengonfirmasi bahwa solusi ini akan mengatasi keputusan konyol GoDaddy untuk memaksakan sesi apppool 5 menit di Plesk!
sumber
Berikut versi plugin JQuery dari solusi Maryan dengan pengoptimalan pegangan. Hanya dengan JQuery 1.7+!
dan bagaimana hal itu mengimpor di * .cshtml Anda
sumber
[Terlambat ke pesta ...]
Cara lain untuk melakukan ini tanpa overhead panggilan Ajax atau penangan WebService adalah dengan memuat halaman ASPX khusus setelah jangka waktu tertentu (yaitu, sebelum batas waktu status sesi, yang biasanya 20 menit):
The
KeepAlive.aspx
halaman hanyalah sebuah halaman kosong yang tidak apa-apa tapi sentuhan / refreshSession
negara:Ini bekerja dengan membuat elemen
img
(gambar) dan memaksa browser untuk memuat kontennya dariKeepAlive.aspx
halaman. Memuat halaman itu menyebabkan server menyentuh (memperbarui)Session
objek, memperpanjang jendela waktu geser kedaluwarsa sesi (biasanya 20 menit lagi). Konten halaman web yang sebenarnya dibuang oleh browser.Cara alternatif, dan mungkin lebih bersih, untuk melakukannya adalah dengan membuat
iframe
elemen baru dan memuatKeepAlive.aspx
halaman ke dalamnya. Theiframe
elemen tersembunyi, seperti dengan membuat elemen anak dari tersembunyidiv
elemen di suatu tempat pada halaman.Aktivitas di halaman itu sendiri dapat dideteksi dengan mencegat tindakan mouse dan keyboard untuk seluruh badan halaman:
Saya tidak bisa mengambil pujian untuk ide ini; lihat: https://www.codeproject.com/Articles/227382/Alert-Session-Time-out-in-ASP-Net .
sumber