2010-02-10 34 views
5

Geliştirme kutumda (Vista/IIS7 üzerinde .NET 2.0) bir ASP.NET web sitesi çalıştırıyorum. global.asax.cs'deki Session_Start yöntemi, her aramayı bir dosyaya (log4net) kaydeder. Session_End yöntemi ayrıca her çağrıyı günlüğe kaydeder.Aynı oturum kimliğine sahip çok sayıda Session_Start

InProc oturum durumunu kullanıyorum ve oturum zaman aşımını 5 dakikaya ayarlayın (20 dakika beklemekten kaçınmak için).

Web sitesine girdim, Session_End günlüğünü gördüğümde 5 dakika bekleyin. Sonra web sitesi F5. Tarayıcılar hala oturum çerezine sahiptir ve sunucuya gönderir. Session_Start çağrılır ve aynı oturum kimliği kullanılarak yeni bir oturum oluşturulur (btw: Veriyi veritabanında saklamak için kullanıldığı için aynı oturum kimliğine ihtiyacım var).

Sonuç: Daha önce sona eren bir oturumda F5'e her vurduğumda, Session_Start yöntemi çağrılır, istek yürütülür ve Session_End yöntemi hemen çağrılır.

Farklı bir tarayıcı açtığımda, Session_Start yöntemi yalnızca bir kez çağrılır. Sonra 5 dakika sonra Session_End F5, Session_Start/request/Session_End dizisinin yürütülmesine neden olur.

web.config ilgili bölümü:

<system.web> 
    <compilation debug="true" /> 
    <sessionState timeout="2" regenerateExpiredSessionId="false" /> 
</system.web> 
+0

Aynı sorun hakkında yardıma ihtiyacım yok, ancak oturum ile uğraşmadığım sitelerde. Tamamen rastgele sitede Session_Start bir DB işlemi bir oturum kimliği ile bir kullanıcı için günde yüzlerce kez yapacak. Uyarı yok, rastgele siteler etkilendi ve cevap yok. –

+0

[bu bağlantı] 'ya bakın (http://stackoverflow.com/a/11375003/779408). Orada gerçek bir çözüm var. – breceivemail

cevap

6

regenerateExpiredSessionId ayar cookieless URLs only ilgilidir, bu yeniden bir oturum tanımlama davranışını etkilemez.

Yaşadığınız sorun, ASP.NET 2.0/3.5 oturumlarının, kullanımda olup olmadığına bağlı olarak ele alınmasından kaynaklanmaktadır. Normal şartlarda, ilk kez kullanılana kadar bir seansı sürdürmeye çalışmaz ve bu nedenle bir oturum çerezi (mevcut değilse) yayınlamaz. İlk oturum kullanılır, sunucuda bir oturum oluşturulur ve bir oturum çerezi verilir.

Artık önceki bir oturum yeniden başlatıldığında ancak kullanılmadığında, ASP.NET biraz karıştı. Kullanılmayan (yeniden başlatılan) oturumu gerekmedikçe terk etmeye çalışır, bu da erken bir Session_End dosyasını yükseltir. Bununla birlikte, önceden varolan oturum çerezini silmez ve bundan sonra gelen her istek diziyi tekrar eder, oturumu yeniden başlatır ve daha sonra, çerez silinene veya oturum kullanılıncaya kadar oturumu sonlandırır.

.Net 4.0'da bu davranış değişti ve olay artık bu durumda tetiklenmiyor.

İlgili konular