win2003 server下的IIS6默認設置下對每個運行在默認應用池中的工作者進程都會經過20多個小時后自動回收該進程,
造成保存在該進程中的session丟失。
因為Session,Application等數據默認保存在運行該Web應用程序的工作者進程中,如果回收工作者進程,則會造成丟失。
解決辦法:
修改配置,設置為不定時自動回收該工作者進程,比如設置為當超出占用現有物理內存60%后自動回收
該進程。通過使用默認應用程序池,可以確保多個應用程序間互相隔離,保證由於一個應用程序的崩潰不會影響另外的
Web應用程序。還可以使一個獨立的應用程序運行在一個指定的用戶帳號特權之下。
如果使用StateServer方式或者Sql Server數據庫方式來保存Session,則不受該設置的影響。
可能的原因2:
系統要運行在負載平衡的 Web 場環境中,而系統配置文件web.config中的Session狀態卻設置為InProc(即在本地存儲會
話狀態),導至在用戶訪問量大時,Session常經超時的情況。引起這個現象的原因主要是因為用戶通過負載平衡IP來訪問WEB
應用系統,某段時候在某台服務器保存了Session的會話狀態,但在其它的WEB前端服務器中卻沒有保存Session的會話狀態,
而隨着並發量的增大,負載平衡會當作路由隨時訪問空閑的服務器,結果空閑的服務器並沒有之前保存的Session會話狀態。
解決辦法:
1.當您在負載平衡的 Web 場環境中運行 ASP.NET Web 應用程序時,一定要使用 SqlServer 或 StateServer 會話狀態模
式,在項目中我們基於性能考慮並沒有選擇SqlServer模式來存儲Session狀態,而是選擇一台SessionStateServer 服務器來
用戶的Session會話狀態。我們要在系統配置文件web.config中設置如下:
還要添加一項
2. 我們同時還要在SessionStateServer 服務器中啟動ASP.NET State Service服務,具體設置:控制面板>>管理工具>>
服務>>ASP.NET State Service,把它設為自動啟動即可。
3. 每台前端WEB服務的Microsoft“Internet 信息服務”(IIS)設置
要在 Web 場中的不同 Web 服務器間維護會話狀態,Microsoft“Internet 信息服務”(IIS) 配置數據庫中 Web 站點的
應用程序路徑(例如,LMW3SVC2)與 Web 場中所有 Web 服務器必須相同。大小寫也必須相同,因為應用程序路徑是區分大小寫
的。在一台 Web 服務器上,承載 ASP.NET 應用程序的 Web 站點的實例 ID 可能是 2(其中應用程序路徑是 LMW3SVC2)。在另
一台 Web 服務器上,Web 站點的實例 ID 可能是 3(其中應用程序路徑是 LMW3SVC3)。因此,Web 場中的 Web 服務器之間的
應用程序路徑是不同的。我們必須使Web 場Web 站點的實例 ID 相同即可。你可以在IIS中把某一個WEB配置信息保存為一個文
件,其他Web 服務器的IIS配置可以來自這一個文件。
Session丟失的解決辦法小結
最近在做ASP.NET項目時,測試網站老是取不出Session中的值,在網上搜索了一下,找到一些解決方法,記錄在這里。最后使
用存儲在StateServer中的辦法解決了問題。
SessionState 的Timeout),其主要原因有三種
一:有些殺病毒軟件會去掃描您的Web.Config文件,那時Session肯定掉,這是微軟的說法。
二:程序內部里有讓Session掉失的代碼,及服務器內存不足產生的。
三:程序有框架頁面和跨域情況。
第一種解決辦法是:使殺病毒軟件屏蔽掃描Web.Config文件(程序運行時自己也不要去編輯它)
第二種是檢查代碼有無Session.Abandon()之類的。
第三種是在Window服務中將ASP.NET State Service 啟動。
下面是幫助中的內容:
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm)
ASP.NET 提供一個簡單、易於使用的會話狀態模型,您可以使用該模型跨多個 Web 請求存儲任意數據和對象。它使用基於字
典的、內存中的對象引用(這些對象引用存在於 IIS 進程中)緩存來完成該操作。使用進程內會話狀態模式時請考慮下面的
限制:
使用進程內會話狀態模式時,如果 aspnet_wp.exe 或應用程序域重新啟動,則會話狀態數據將丟失。這些重新啟動通常會在
下面的情況中發生:
在應用程序的 Web.config 文件的 元素中,設置一個導致新進程在條件被滿足時啟動的屬性,例如
memoryLimit。
修改 Global.asax 或 Web.config 文件。
更改到 Web 應用程序的 Bin 目錄。
用殺毒軟件掃描並修改 Global.asax 文件、Web.config 文件或 Web 應用程序的 Bin 目錄下的文件。
如果在應用程序的 Web.config 文件的 元素中啟用了網絡園模式,請不要使用進程內會話狀態模式。否則將
發生隨機數據丟失。
還有這二種:
一:在第一個頁面置了SESSION,然后REDIRECT去第二個頁面。解決方法是在REDIRECT中設置endResponse為FALSE。
二: ASP.NET中使用了ACCESS數據庫,而且數據庫是放在bin目錄中的。解決方法是不要放會更新的文件在BIN目錄中。
參考:http://www.dotnet247.com/247reference/msgs/58/290316.aspx
Asp.net 默認配置下,Session莫名丟失的原因及解決辦法
正常操作情況下Session會無故丟失。因為程序是在不停的被操作,排除Session超時的可能。另外,Session超時時間被設定
成60分鍾,不會這么快就超時的。
這次到CSDN上搜了一下帖子,發現好多人在討論這個問題,然后我又google了一下,發現微軟網站上也有類似的內容。
現在我就把原因和解決辦法寫出來。
原因:
由於Asp.net程序是默認配置,所以Web.Config文件中關於Session的設定如下:
我們會發現sessionState標簽中有個屬性mode,它可以有3種取值:InProc、StateServer?SQLServer(大小寫敏感) 。默認
情況下是InProc,也就是將Session保存在進程內(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),這個進程不穩定,在某些事
件發生時,進程會重起,所以造成了存儲在該進程內的Session丟失。
哪些情況下該進程會重起呢?微軟的一篇文章告訴了我們:
1、配置文件中processModel標簽的memoryLimit屬性
2、Global.asax或者Web.config文件被更改
3、Bin文件夾中的Web程序(DLL)被修改
4、殺毒軟件掃描了一些.config文件。
更多的信息請參考PRB: Session variables are lost intermittently in ASP.NET applications
解決辦法:
前面說到的sessionState標簽中mode屬性可以有三個取值,除了InProc之外,還可以為StateServer、SQLServer。這兩種存
Session的方法都是進程外的,所以當aspnet_wp.exe重起的時候,不會影響到Session。
現在請將mode設定為StateServer。StateServer是本機的一個服務,可以在系統服務里看到服務名為ASP.NET State Service
的服務,默認情況是不啟動的。當我們設定mode為StateServer之后,請手工將該服務啟動。
這樣,我們就能利用本機的StateService來存儲Session了,除非電腦重啟或者StateService崩掉,否則Session是不會丟的(
因Session超時被丟棄是正常的)。
除此之外,我們還可以將Session通過其他電腦的StateService來保存。具體的修改是這樣的。同樣還在sessionState標簽中
,有個stateConnectionString='tcpip=127.0.0.1:42424'屬性,其中有個ip地址,默認為本機(127.0.0.1),你可以將其改
成你所知的運行了StateService服務的電腦IP,這樣就可以實現位於不同電腦上的Asp.net程序互通Session了。
如果你有更高的要求,需要在服務期重啟時Session也不丟失,可以考慮將mode設定成SQLServer,同樣需要修改
sqlConnectionString屬性。關於使用SQLServer保存Session的操作,請訪問這里。
在使用StateServer或者SQLServer存儲Session時,所有需要保存到Session的對象除了基本數據類型(默認的數據類型,如
int、string等)外,都必須序列化。只需將[Serializable]標簽放到要序列化的類前就可以了。
如:
復制 保存
[Serializable]
public class MyClass
{
//......
}
具體的序列化相關的知識請參這里。
至此,問題解決。