2010-02-10 54 views
5

我在我的開發框(Vista/IIS7上的.NET 2.0)上運行ASP.NET網站。 global.asax.cs中的Session_Start方法記錄每個對文件(log4net)的調用。 Session_End方法還會記錄每個呼叫。大量具有相同會話ID的Session_Start

我正在使用InProc會話狀態,並將會話超時設置爲5分鐘(以避免等待20分鐘)。

我打了網站,等了5分鐘我看到Session_End日誌單元。然後我F5的網站。瀏覽器仍然有會話cookie並將其發送到服務器。 Session_Start被調用,並使用相同的會話ID創建一個新的會話(順便說一句:我需要這是相同的會話ID,因爲它用於存儲數據在數據庫中)。

結果: 每次我在先前結束的會話上點擊F5時,都會調用Session_Start方法,執行請求並立即調用Session_End方法。

當我打開不同的瀏覽器時,Session_Start方法只被調用一次。然後在5分鐘後Session_End每個F5都會導致執行Session_Start/request/Session_End序列。

web.config中相關章節:

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

我需要關於這個問題的幫助,但是在那些我沒有搞砸會話的網站上。隨機完成,該網站將爲每位具有一個會話ID的用戶每天進行數百次的Session_Start數據庫事務處理。沒有警告,隨機的網站受到影響,並且沒有答案。 – 2010-04-30 19:00:51

+0

看看[這個鏈接](http://stackoverflow.com/a/11375003/779408)。那裏有真正的解決方案。 – breceivemail 2012-07-08 05:38:09

回答

6

regenerateExpiredSessionId設置與cookieless URLs only,它不會影響將被重用的會話cookie的行爲。

您遇到的問題是由於ASP.NET 2.0/3.5根據它是否在使用來處理會話的方式。在正常情況下,它不會嘗試在第一次使用會話前持續會話,因此不會發出會話cookie(如果它不存在)。第一次會話使用的是,會話在服務器上創建併發出會話cookie。

現在,當前一個會話重新啓動但未使用時,ASP.NET會有點困惑。它試圖立即放棄未使用(重新啓動)的會話,因爲它不是必需的,這會引發早期的Session_End。但是,它不會刪除預先存在的會話cookie,因此每個後續請求都會重複該順序,重新啓動並終止會話,直到cookie被刪除或使用會話。

在.Net 4.0中,此行爲已更改,並且事件在此情況下不再觸發。