2011-01-27 10 views
22

Oturumu zaman aşımına uğradığında bir kullanıcı çıkmak istiyorum. Yani Global.asax aşağıdaki kodu kullanılır:Session_End yanmıyor mu?

protected void Session_End(object sender, EventArgs e) 
{ 
    FormsAuthentication.SignOut(); 
} 

Ama session_end patlar asla görünüyor. Herhangi bir fikrin nasıl düzeltebiliriz? ASP.NET'i varsayılan ayarlarla kullanıyorum.

+3

den

public void Session_End(Object sender, SessionEndedEventArgs e) { } 

Çağrı bu? – leppie

+0

@leppie: kesinlikle evet! Ben de bu çizgiyi şu şekilde değiştirdim: "yeni istisna at (" ");" ama hala çalışmıyor. –

+0

@InSane: Bunu nasıl sağlayabilirim? Oturumumun belirli bir süreden sonra gerçekten sona erdiğini biliyorum. Yani InProc –

cevap

34

session_start bazı Oturum verilerini ayarlayabilir gerekir. Bu olmadan, Session_End kovulmayacak. Ayrıca burada dikkat edilmesi gereken bir başka çok önemli olan oturumda şeyi kaydetmek yoksa Session_End olayı olmasıdır this

görüyoruz. Session_End etkinliğinin tetiklenmesi için en az bir kez oturumda kaydedilmiş bir şey olmalı. Bu aynı zamanda, ilk istekte seansta bir şey kaydettiğinizde ve aynı talepte oturumdan vazgeçerseniz, oturumda kaydedilen hiçbir şey olmadığı için Sesison_End olayı ateşlenmeyeceği anlamına gelir.

+4

Bu kabul edilen yanıt olmalıdır –

+0

Çok ilginç; Bilmediğim bir şey. Ayrıca çok mantıklı. IMHO, bu cevap. – nocarrier

+0

Dubya'ya katılıyorum. –

1

Asla ateşlemediğinden emin misiniz?

Anladığım kadarıyla, Session_End, ASP.NET oturumunun, istemciden gelen son istek sonrasındaki zaman aşımı nedeniyle sonlandırıldığı için geçerli isteğiyle alakası yoktur. FormsAuthenticaion.SignOut numaralı çağrı, kimlik doğrulama çerezlerini işler ve bu nedenle istemciden (tarayıcı) hiçbir bağlantı olmadan hiçbir etkisi yoktur.

(bir cevabı var olan) bu soruya bir göz atın - Sorun az ya da çok sizinkine benzer bir doğru çözümü bulabilirsiniz böylece: Bu yardımcı olur

Session_End in Global.asax.cs not firing using forms authentication

Umut. web.config içinde

5

Eğer elemana

<configuration> 
    <system.web> 
      <sessionState mode="InProc" /> 
      ..... 
    </system.web> 
</configuration> 
+1

Ayrıca hiçbir şeye değmez Session_End InProc dışında herhangi bir sessionState ile çalışmaz. – Phill

+0

Seansı InProc olarak değiştirdim. Ancak, session_end henüz tetiklenmiyor. –

+3

Bunu IIS'de veya Visual Studio'da çalıştırıyorsanız, WebDev ile VisualStudio'da bulunuyorsa, olayın etkinliğini görmezsiniz. Test etmek için web sitenizi IIS'ye koymanız ve hata ayıklayıcısını w3wp.exe – Phill

5

bilmiyorum bir çocuk olarak SessionState elemanı olması gerekir, bu özellik veya hatasıdır. Ya da ASP.NET'te yeterince oturum yönetimi anlamıyorum. Ama bulduğum şey bu.

Session_Start, Session_Start bildirilmediyse, ASP.NET MVC 4'te (web.config'te sessionState öğesi için varsayılan ayarlarla) çalışmaz.

Yani Session_End yakalamak için session_start beyan :)

protected void Session_Start(Object sender, EventArgs e) { } 

protected void Session_End(Object sender, EventArgs e) { 
    Debug.WriteLine("End. " + Session.SessionID); 
} 
+1

Bunun için teşekkürler. –

0

Nasıl çalıştığını bilmiyorum, ancak zaman aşımından sonra tarayıcımı kapattığımda yanacak. Gerçekten ateş olaya bunun için 20 dakika beklemek mi

Application_Start() Event 

    SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End); 
İlgili konular