如果你發現session突然無理由的丟失,而當你認真的檢查代碼並且排除其它常規可能丟失
的可能性時,你可能會像我一樣,幾乎要接近崩潰~!
後來發現問題出在我用代碼創建一個臨時目錄然後刪除臨時目錄的刪除操作上。
現在和大家分享下:希望對碰到類似釘子的朋友有用。。
說白了session丟失實質就是:應用程序重起!
應用程序什麼時候自動重起呢?
請參考:Anand在dotnetindia.com發表的文章
原文引用
{
Why ASP.Net Restarts?
Found this link from one of the blogs I was browsing today. This is ASP.Net Forum post by Patrick Y. Ng of MS.
This talks about both 1.0 and 1.1
This behaviour has been bugging lots of people. ASP.Net will restart its application for various reasons. All these reasons are legitimate, but the side effect is that the application will reset all its cache, application state, and InProc session states.
You can detect the restart of application and worker process by using the performance monitor. The counters to monitor are "ASP.NET\Application Restarts" and "ASP.Net\Worker Process Restarts".
For worker process restart, ASP.Net will write an entry in the eventlog to explain why (logLevel in controls how often eventlog is written).
For application restart, however, in v1 and v1.1 there is no easy way for a customer to figure out why a restart happened.
So by listing all reasons for app restart, I hope I can help some customers to understand and avoid the restart.
For v1
------
'http://www.knowsky.com
{
Things that causes application restart:
- The max compilation limit is reached (look for numRecompilesBeforeApprestart in Machine.config)
- Physical application path of the web application has changed.
- Change in global.asax or one of the included files
- Change in Machine.config
- Change in web.config in the app root
- Change inside bin directory or its subdirs
- A directory is renamed to bin, or bin is created
- Overwhelming change notifications – too many files are changed too fast in one of content directorIEs – could happen if, for example, files are generated on the fly per request
- Change in the code-Access security policy file
}
- The settings of various attributes in in Machine.config affect the restart/shutdown of the worker process itself. However, if you use Windows 2003, and (by default) you are NOT using IIS5 isolation mode, is ignored. Instead, the settings in "Application Pools" in IIS manager is used.
For v1.1
--------
The list for v1.1 is the same as v1, with the following new conditions:
{
- User code called HttpRuntime.UnloadAppDomain
- Any directory under the web application folder is renamed
}
IIS 6.0
--------
If you're using IIS 6.0, and you're not using IIS 5 compatible mode, then ASPnet_wp.exe will be replaced by w3svc.exe. You may want to go to IIS Manager, go to Application Pools/DefaultAppPool, and see if any of the parameters on the Recycling and Performance tabs are causing the IIS worker process (w3svc.exe) to shutdown.
}
也就是說 ASP.Net 會監視應用程序目錄,一但有被監視
的動作發生(比如:修改了config、重命名目錄等)應用程序就會自動重起
當然這時你的session一定丟失了。
如果避免不了這種操作(如:重命名目錄);這裡我們可以用cookIE存信息或存到數據庫去;
注意:除了以上列出的英文條件外。目錄的刪除操作一定丟失session。ASP.Net的內部機制對待目錄有點像個守財奴,它死守著目錄,你創建它不會管(往裡加),一但創建他就會監視該目錄,若你要刪除或重命名它的(動它的目錄),它就發生重起了。