2010-10-28 31 views
0

在我的項目中,我配置了.NET的會話以進入數據庫。 我也有一個global.asax實現Session_Start()。 在Session_Start()中,我向會話寫入三件事:.NET會話處理如何工作?如果Cookie被禁用,會話就會佔用所有內存

  • 會話開始的時間。
  • 用戶的主機地址。
  • 包裝用戶代理的可序列化設備對象。

現在的問題是,不允許cookies的用戶不允許使用會話cookie。 (通過將站點URL放入IE的受限站點可輕鬆重現)。

如果我繼續刷新(將手指放在F5上),將爲每個請求( - >無會話cookie)創建一個新會話。不久之後,Web服務器進程增長到幾百兆字節。 如果使用IIS7或Cassini本地Web服務器,則無關緊要。

現在的問題是:內存不會在會話超時之前釋放。這裏的邏輯是什麼,如果會話應該真的去數據庫? .NET將它們保存在內存中多久?最終,你甚至會遇到Out of Memory異常!

有人知道嗎?如何檢測和防止這種(幾乎是惡意的)「攻擊」?

回答

0

有何這裏的邏輯,如果會議 真的應該去數據庫?

誰說他們去數據庫?如果這是你的代碼在開始停止 - ,.NET不知道它。所以它讓他們記憶。

的問題是,現在的用戶不容許的cookie不會允許會話cookie 要麼

我會說這有點不尋常。大多數阻止Cookie的用戶不會阻止會話cookie。

不久,Web服務器進程發展到一定百兆

不是問題。像「當它達到1.5GB時回來」。

一般來說,.NET會將內存保留在內存中,因爲它們比從數據庫訪問要快得多。用戶拒絕會話cookie有問題,但應該是一個稀有問題。

+0

他們應該去數據庫,因爲我沒有定義「進程中」會話,但在web.config中處理數據庫會話。即使不尋常,我發現一個不接受cookie的客戶端可能會讓整個服務器停止運行.net項目,這更加不尋常。正如我所說:最終,Web服務器將耗盡內存並回收。這是有問題的 – Krumelur 2010-10-30 19:55:40

0

你爲什麼首先開始一個會議?看起來像指定的信息應該在Cookie中,而不是一個會話。通過這樣做,你也可以擺脫這個問題。

僅使用會話保持用戶狀態(登錄後)。

+0

我不想討論爲什麼我會做事情。這是一個考驗。問題實際上是:在web.config中,我設置了指定數據庫會話狀態。所以我認爲在某些時候,.net會開始使用該數據庫,但它會一直推動會話進入內存。爲什麼不交換? – Krumelur 2010-10-30 19:53:41