Session.Abandon () ve Session.Clear () arasındaki fark nedir


109

Bir oturumu yok etmek ile değerlerini kaldırmak arasındaki fark nedir? Lütfen bunu gösteren bir örnek verebilir misiniz?

Bu soruyu aradım ama toplam cevabı anlamadım. Bazı cevaplar:

  • Session.Abandon() seansı yok eder
  • Session.Clear() sadece tüm değerleri kaldırır

Bir arkadaşım bana şunu söyledi:

Oturumu temizlemek oturumu silmeyecektir, kullanıcı için aynı ID ile varlığını sürdürür, ancak değerleri basitçe temizlenir.

Abandon, oturumu tamamen yok eder, yani o kullanıcı için oturumda daha fazla değer depolayabilmeniz için yeni bir oturuma başlamanız gerekir.

Aşağıdaki kod çalışır ve herhangi bir istisna oluşturmaz.

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

Bir Oturumu Terk ettiğinizde (), siz (veya daha doğrusu kullanıcı) yeni bir SessionId alacaksınız.

Oturumu test ettiğimde, oturumu terk ettiğimde herhangi bir değişiklik yapmıyor.

Sadece bir fark buluyorum: olay session.Abandon()yükseltirSession_End


5
Session.Clear öğeleri hemen kaldırır ancak Session.Abandon mevcut isteğin sonunda oturumu terk edilecek şekilde işaretler.
RepDbg

Yanıtlar:


148

Temizle - Tüm anahtarları ve değerleri oturum durumu koleksiyonundan kaldırır.

Terk - Bir Oturumun saklanan kaldırır tüm nesneleri. Abandon yöntemini açıkça çağırmazsanız, sunucu bu nesneleri kaldırır ve oturum zaman aşımına uğradığında oturumu yok eder.
Ayrıca Session_End gibi olayları da gündeme getirir .

Session.Clear, tüm kitapları raftan çıkarmakla karşılaştırılabilir , Session.Abandon ise tüm rafı atmak gibidir .

Diyorsun:

Oturumu test ettiğimde, oturumu terk ettiğimde herhangi bir değişiklik yapmıyor.

Bu, yalnızca bir istek dahilinde yaptığınız sırada doğrudur .
Bir sonraki talepte oturum farklı olacaktır. Ancak oturum kimliği , kimliğin aynı kalması için yeniden kullanılabilir .

Session.Clear kullanacaksanız birçok istekte aynı oturuma sahip olacaksınız.

Genel olarak, çoğu durumda Session.Clear kullanmanız gerekir.
Kullanıcının sitenizi terk edeceğinden eminseniz Session.Abandon'u kullanabilirsiniz.

O halde farklılıklara geri dönelim:

  1. Abandon, Session_End isteğini artırır.
  2. Temizle öğeleri hemen kaldırır, Abandon kaldırmaz.
  3. Abandon, SessionState nesnesini ve öğelerini serbest bırakır, böylece kaynakları serbest bırakmak için toplanan çöpleri baĢlatabilir. Clear, SessionState'i ve onunla ilişkili kaynakları tutar.

ve session.clear () 'ı çağırırsam bu, Accures'ı tekrar söyler. değil? (Session_End olayını yükselten diğer tüm)
arka kapı

Session.Clear, yalnızca Oturumdaki öğeleri kaldırır. Daha fazlası yok. Onu gerektiği kadar arayabilirsin.
Dmytrii Nagirniak

@AnthonyWJones, haklısın "yok et" demek yanlış. Daha iyisi, nesneleri oturumdan KALDIR. Ancak Session.Clear aynı zamanda nesneleri yok etmez, thm'yi oturumdan kaldırarak çöplerin toplanmasını sağlar. Ayrıca, KARMAŞIK nesnelerin depolanması tavsiye edilmez, aksi takdirde iyi buluyorum.
Dmytrii Nagirniak

@Dmitriy: Neden "KARMAŞIK nesnelerin saklanması önerilmez"?
Kamarey

5
Bunu diyerek uzanacak olsa da kabul @Ads Session.Clearraftan tüm kitapları çıkarmadan ile karşılaştırılabilir hemen ederken, Session.Abandondaha "bütün raf atmak demek gibi bir ve işiniz bittiğinde bana haber ver ".
WynandB

20

Bir Abandon()Oturum açtığınızda , siz (veya daha doğrusu kullanıcı) yeni bir SessionId (sonraki istekte) alacaksınız. Bir Clear()Oturum açtığınızda , saklanan tüm değerler kaldırılır, ancak SessionId olduğu gibi kalır.


3
Teşekkürler. ancak mattew macdonalds kitabına göre aynı oturum kimliğini kullanabilir. i web.config dosyasında yapılandırma / system.web / SessionState ayağında regenerateExpiredSessionId özniteliği yanlışsa, ASP.Net eski oturum kimliği kullandığı anlamına gelir
arka kapı

2
@Hans Kesting Vazgeçme çağrıldığında yeni bir Oturum Kimliği alamayacak. Yeni bir Oturum Kimliği almak için ASPNET_SessionID tanımlama bilgisini açıkça null olarak ayarlaması gerekir.
Zo Has

9

Bu tür yukarıda çeşitli tepkiler kapsadığı ki, ama ben bu yazıyı ilk okuduğumda benim kodunda ufak bir hatadan açan önemli bir gerçeği, cevapsız ...

Session.Clear() tüm anahtarların değerlerini SİLECEK, ancak oturum sonlandırma olayının başlamasına neden OLMAYACAKTIR.

Session.Abandon()mevcut talep üzerindeki değerleri SİLMEZ. Başka bir sayfa istenirse, o sayfa için değerler silinecektir. Ancak terk etme olayı ATACAKTIR.

Yani, benim durumumda (ve belki de sizinki de?), Ben gerekli Clear()izledi Abandon().


1
Neden Session.Clear () ve ardından Session.Abandon () 'a ihtiyacınız var? Yok ettiğiniz bir koleksiyonun değerlerini mi temizliyorsunuz? Bu tamamen gereksizdir. Oturum nesnesinin hemen yok edilmediğinden emin olun (bu, mevcut isteğin sonunda gerçekleşir), ancak bu oturum kimliği, sonraki herhangi bir istek tarafından artık sunulmayacaktır. Müşteri yeni bir talepte bulunursa, onlara yeni bir oturum verilecektir. Global.Asax'ın Session_End () olayındaki herhangi bir oturum değişkenine erişmek istiyorsanız, önce Temizle'yi çağırmak da sorunlara neden olur (bunları temizlediğiniz için orada olmayacaklar).
RepDbg

@RepDbg aslında katılmıyorum. Session.Abandon (). müşteriye yeni bir oturum kimliği verir. Session.clear, sunucudaki oturumla ilgili tüm bilgileri temizler, böylece başka hiçbir kullanıcı bunu yapamaz. NRC
Micah Armantrout'a

@ Micah Armantrout Mantığınızı takip etmiyorum. Session.Clear () ile bir oturumu neden temizledikten sonra Session.Abandon () 'u çağırın ve bu sadece oturumu temizlemekle kalmayıp aynı zamanda serbest bırakmayı da tamamen kaldırır? Ayrıca Session.Abandon () istemciye yeni bir oturum kimliği vermez. Sonraki bir istek, Session.Abandon () olarak adlandırılan isteğin yerine getirilmesini sağlayacaktır.
RepDbg

Yalnızca Session.Abandon kullanırsanız, ASP.NET işlem hattında kalan diğer mantık geçerli oturum değerlerine yine de erişebilir.
Mark Sowul

6

bu kod çalışır ve herhangi bir istisna oluşturmaz:

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

Bunun nedeni, Abandon yöntemi çağrıldığında, geçerli Session nesnesinin silinmek üzere kuyruğa alınması, ancak geçerli sayfadaki tüm komut dosyası komutları işlenene kadar gerçekte silinmemesidir. Bu, Abandon yöntemine yapılan çağrı ile aynı sayfadaki Session nesnesinde depolanan değişkenlere erişebileceğiniz, ancak sonraki Web sayfalarında erişemeyeceğiniz anlamına gelir.

Örneğin, aşağıdaki komut dosyasında üçüncü satır Mary değerini yazdırır. Bunun nedeni, sunucu komut dosyasını işlemeyi bitirene kadar Session nesnesinin yok edilmemesidir.

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

MyName değişkenine sonraki bir Web sayfasında erişirseniz, boştur. Bunun nedeni, önceki örneği içeren sayfanın işlenmesi tamamlandığında MyName'in önceki Session nesnesiyle yok edilmiş olmasıdır.

dan MSDN Session.Abandon


3

Bir oturumu temizlemek, orada depolanan değerleri kaldırır, ancak yine de oraya yenilerini ekleyebilirsiniz. Seansı yok ettikten sonra oraya yeni değerler ekleyemezsiniz.


teşekkürler ama bu işe yarıyor: (fikrinize uygun değil) Session.Abandon (); Oturum ["tempKey1"] = "tempValue1"; Response.Write (Session [ "tempKey1"] ToString ().);
arka kapı

Bunun nedeni, sayfanızı yeniledikten sonra oturumun yok edilmesidir. Oturum kimliği (genellikle) bir çerezde saklanır.
RaYell

anlamıyorum yani Session.Abandon () 'u çağırdıktan sonra hala ona değer ekleyebilirim. (sayfa geri gönderilip tekrar işlese bile).
arka kapı

1
Oturumu, yok edildikten sonra kimliği otomatik olarak oluşturacak şekilde ayarlamış olabilirsiniz. Dolayısıyla, yok edilen oturuma bir değer atadığınızda, yeni oturum otomatik olarak oluşturulacaktır.
RaYell

1
evet, bu oturum kimliğini kullanmak yenilenecek ama benim sorum şu: session.clear () ile session.abandone () arasında ne fark var. bu şekilde autoregenerate false olarak ayarlandığında, bu kıtık Sesion_End'i yükselten başka hiçbir şeyden farklı değil mi?
arka kapı

3

temizle-anahtar veya değerleri oturum durumu koleksiyonundan kaldırın ..

terk-oturum nesnelerini oturumdan kaldırma veya silme ..


1
Session.Abandon() 

tüm oturumu yok edecek / öldürecek.

Session.Clear()

oturum verilerini (yani mevcut oturumun anahtarları ve değerleri) kaldırır / temizler ancak oturum canlı olacaktır.

Session.Abandon () yöntemiyle karşılaştırıldığında, Session.Clear () yeni oturumu oluşturmaz, yalnızca oturumdaki tüm değişkenleri NULL yapar.

Oturum kimliği, tarayıcı kapalı olmadığı sürece her iki durumda da aynı kalacaktır.

Session.RemoveAll()

Tüm anahtarları ve değerleri oturum durumu koleksiyonundan kaldırır.

Session.Remove()

Oturum durumu koleksiyonundan bir öğeyi siler.

Session.RemoveAt()

Belirli bir dizindeki bir öğeyi oturum durumu koleksiyonundan siler.

Session.TimeOut()

Bu özellik, uygulama için Session nesnesine atanan zaman aşımı süresini belirtir. (zaman dakika cinsinden belirtilecektir).

Kullanıcı zaman aşımı süresi içinde bir sayfayı yenilemez veya talep etmezse, oturum sona erer.



0

Session.Clear()Kullanmaktansa kullanmanın kullanışlı olacağını düşünüyorum Session.Abandon().

Çünkü değerler, daha sonra arandıktan sonra hala oturumda var, ancak birincisi arandıktan sonra kaldırılıyor.


0
this code works and dont throw any exception:

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

Burada dikkat edilmesi gereken bir nokta, Session.Clear'ın öğeleri hemen kaldırması, ancak Session.Abandon'un mevcut isteğin sonunda oturumun terk edileceğini işaretlemesidir. Bu basitçe, session.abandon komutu çalıştırıldıktan hemen sonra koddaki değere erişmeye çalıştığınızı varsayalım, hala orada olacaktır. Bu nedenle, kodunuz session.abandon komutunu verdikten ve oturumla hemen bir mantık yaptıktan sonra bile çalışmıyorsa kafanız karışmasın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.