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

没有更多推荐了,返回首页