天天看點

Session丢失問題調試

有時候發現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

繼續閱讀