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