2010-03-29 84 views

回答

3

我必須不同意達林。我在Session_End中調用一個函數來記錄會話結束。我沒有明確地測試過,但是我最近幾次查看了我的日誌,發現應用程序池已被回收。函數被調用並且活動會話的結束被記錄。

這發生在應用程序池按計劃回收以及由於部署了一些新dll而回收時。

+0

同意,剛剛測試過,它發射:-) – 2010-03-29 18:57:31

1

如果我記得正確(自從我閱讀文檔以來有一段時間),具有活動會話將延遲正常的應用程序池回收計時器(當資源應該被釋放時觸發),因爲活動會話上的服務器銀行意味着存在繼續需要。一旦會話過期(並觸發session_end事件),應用程序回收計時器將重新開始計數並最終在線程池釋放自己的資源並終止應用程序之前觸發。

這就是在正常情況下,應該注意的是,session_end事件不保證被觸發(在那裏使用非常具體的情況下它不會),我想現在這主要與IIS的崩潰實例有關或應用程序池回收OOM或錯誤。它用於除非你只使用其中一種會話類型(我相信狀態服務器)它不會可靠地觸發。現在可能會有所不同。

如果你需要保證資源被釋放,我不確定session_end是做它的合適的地方。你可以將它提升到應用緩存或HTTP緩存,並使用定期清理事件的會話唯一密鑰?這可能更可靠(更多的代碼),但更可靠。

這一直是我認爲Session_End中大火相當可靠的一般經驗,但我已經看到了失敗的大負載下(點擊第二的100S),我知道,當你開始談論服務器農場它變得複雜得多爲好。

+0

我只說最多20-30個用戶,但是打開連接的開銷非常高,我不信任遠程服務器關閉它。 – 2010-03-29 22:30:07

1

還要注意,只有在使用Inproc會話模式時纔會調用Session_End。對於其他模式(包括SQL會話狀態模式),此事件永遠不會發生。