服務熱線
153 8323 9821
原因:是這樣的,我用Session記錄用戶登錄的ID,如Session["UserID"] = “從數據庫中讀取的用戶ID”,那我當然用它去判斷了
If(Session["UserID"] == null)
{
Response.Redirect("Login.aspx");//如果用戶沒登錄了就返回登錄頁
}
但我發現我沒顯式的釋放Session,過一會或者我刷新幾次本頁,就自動把我踢到Login.aspx,我想是Session超時了,
可我在IIS里設置的是30分鐘,在Web.config里設置的也是設置了很長時間如 “<sessionState timeout="600"></sessionState>”
那雜有時候沒幾分鐘就被轉到Login.aspx,有時過半個多小時才被踢到Login.aspx。很不穩定。
請各位大蝦指教,不甚感激。告訴我為什么?
以下為回答1:
1.asp.net的session過期是不同于asp的,就算你設置了過期時間是20分鐘,也到不了20分鐘。因為當系統資源不足時,asp.net會回收進程,當進程回收session就不存在了,如果在虛擬主機上這種回收是很快的。如果你有好幾臺服務囂用負載平衡的話。這種問題也常發生。
2.解決方法,使用專用的session存儲session或sql存儲,asp.net支持這些方法。設置方法見msdn
3.建議,使用加密的cookie存儲這些數據。減少服務囂的負擔和開支,支持率高。方便。
回答2:
說過無數次了,那不叫做“過期”,那叫做“丟失”。
當你說那是“過期”,也就按照自欺欺人的“過期”規則去看問題了,肯定是瞎聯想到有關設置過期時間之類的方面上去了。
去了解Session為什么會丟失吧!我可以很可信地告訴你,如果你租用空間商的虛擬主機,那么每隔8~15分鐘就丟失一次所有Session集合、Application集合、所有static變量值等事情,這是很正常的網站維護行為。
所以不要輕信那些在個人電腦上玩一玩開發環境、練手的入門書上的資料。要結合你的應用部署的服務器特性來處理這個“丟失”問題。
有人說是Session的Bug?什么意思?
這個跟Session也沒有必然關系,因為連Application集合、所有static變量,也都“丟失”了。
相反地,IIS、asp.net,都有msdn等等許多文檔講過應用程序狀態管理中InProc模式下會有上百種數不盡的情況下會隨時重啟應用程序的設計。文檔中清晰地說明了應用程序會重啟,所以說如果你認為是Session的bug只能說是你編程缺乏實踐經驗,被那些入門書的作者用簡單化的方法忽悠了。
回答3(提問者最后解決) 這個問題本人也是這樣解決過
我在Web.config里把Session保存在StateServer,并到services.msc下開啟了ASP.NET狀態服務。目前本地測試刷新了50遍,吃了個飯,還是好的。不知道傳到服務器上會否一樣好的。又長知識了,成天光知道寫代碼,對他的機制一點不了解,真是慚愧