有时候发现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时间中记录一些调用栈相关信息来判断是否有该问题发生。