有時候發現IIS網站經常session丢失,使用者被迫重新登陸網站。造成這個問題的原因可能有這麼幾種
- session timeout過短
- 應用程式池回收
- 程式調用主動關閉session
Session timeout
首先要确定這個網站是asp還是asp.net網站,IIS對于ASP和ASP.net的session配置在不同的地方。
對于ASP網站,session的控制在IIS Manager - Website Features - ASP - Services - Session Properties,通過這裡的配置可以控制是否啟用session,最大session數量以及session timeout時間等配置。
對于ASP.NET網站,session的控制在IIS Manager - Website Features - Session State,通過這裡可以控制asp.net session相關的屬性。
應用程式池回收
如果想判斷是否是應用程式池重起造成的問題,可以通過IIS log或者Event Log來判斷是否在發生問題的時間應用程式池發生過重起。
IIS log來判斷的方式比較簡單,
打開發生問題當天的IIS log,注意IIS log中記錄的時間一般是UTC時間。如果IIS在某一時間發生過重起,那麼log的頭會重新寫入,如下
#Software: Microsoft Internet Information Services 7.5
#Version: 1.0
#Date: 2012-11-09 05:05:00
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) sc-status sc-substatus sc-win32-status time-taken
通過Event log來判斷需要打開IIS Recycle Event logging,連結如下
logEventOnRecycle
http://www.iis.net/configreference/system.applicationhost/applicationpools/add/recycling
打開之後應用程式池重起就會寫入系統日志,直接檢視系統日志即可。
應用程式池正常重起原因,
- 管理者手動重起
- 應用程式池根據配置的回收政策自動重起
- 應用程式池空閑逾時重起
應用程式池意外重起的原因多種多樣,比如
- Machine.Config, Web.Config or Global.asax are modified
- The bin directory or its contents is modified
- The number of re-compilations (aspx, ascx or asax) exceeds the limit specified by the <compilation numRecompilesBeforeAppRestart=/> setting in machine.config or web.config (by default this is set to 15)
- The physical path of the virtual directory is modified
- The CAS policy is modified
- The web service is restarted
- (2.0 only) Application Sub-Directories are deleted (see Todd’s blog http://blogs.msdn.com/toddca/archive/2006/07/17/668412.aspx for more info)
程式調用主動關閉session
另外一種不太常見的可能性是程式本身調用了結束session的方法或者手動設定了一個不同的session timeout值,例如asp 的Session.Abandon方法或者asp.net中的HttpSessionState.Abandon方法。這種情況的調試方法可以通過在SessionStateModule.End時間中記錄一些調用棧相關資訊來判斷是否有該問題發生。 http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstatemodule.end(v=vs.100).aspx