首页 > 代码库 > 浅谈asp.net session time out问题
浅谈asp.net session time out问题
公司已经在production的一个project最近有client反馈说登陆进网站之后,开着一整天没动它,之后还是可以继续操作。client那边的IT部门要求我们提供session time out方面的设置,以及工作原理。自认为做了5年的web application,clients这个基本的要求可以很快搞定。
1. 检查Web.config文件里面的timeout设置
在system.web下面的sessionState中,可以设置timeout属性。项目中,发现同事把这个值设成了7200。这个数字的单位是minute,同事错以为是second,想设2个小时,却设成了5天。
本以为这个就解释了为什么client开着一整天不去动,之后还可以继续操作的问题。但是后面又接到反馈说,那个网站并不可以开着5天不会time out,有client开着一天多,就time out了。为什么呢?
2. 检查IIS Application Pool的Idle time out设置
这个设置的作用是,application pool在设置的时间范围内没有收到任何请求,就把网站的session time out。默认值是20 minutes。因此,当网站只有一个user登陆进来,之后的20分钟他没有发送任何请求给服务器,而且这20分钟内没有其他user来访问,那么这个user在20分钟后就会time out,而不是web.config设置的5天。
3. 检查IIS Application Pool的Recycling设置
Regular Time Interval这个设置的作用是,IIS在设置的时间到期后,会强制回收所有的资源,进而导致网站session time out。默认值是1740 minutes。很可能这个1740分钟,也就是29小时,是让user time out的原因。前面的Idle time out的值不可以超过这个值。
如果到目前为止我理解都正确,那么一个流量很大的网站,24小时不间断会有用户访问,那每隔29个小时,在recycling期间登录用户的session会丢失。
为了追踪user time out的准确时间,我在global.asax中的session_start和session_end中写入了文本log。需要注意的一点是,这个文本log不可以放在网站所有目录。因为每次网站目录中内容更改会触发session time out。这点让我花了很多时间去google才明白。
期待这个log的结果...
参考链接:
http://issuesdotnet.blogspot.sg/2012/06/directorydelete-expires-session-solved.html
http://forums.asp.net/t/1742313.aspx?session+expired+problem+after+deleting+a+folder+and+its+sub+folder+programatically+in+asp+net
http://www.thecodeking.co.uk/2011/08/why-sessionend-is-sometimes-called.html#.VG2skYuUfzl
http://stackoverflow.com/questions/19002254/what-is-the-default-expiration-time-of-a-cookie
http://erlend.oftedal.no/blog/?blogid=41
http://stackoverflow.com/questions/19985710/iis-idle-timeout-vs-recycle
http://technet.microsoft.com/en-US/en-en/library/cc771956(v=ws.10).aspx
http://bradkingsley.com/iis7-application-pool-idle-time-out-settings/
http://weblogs.asp.net/owscott/why-is-the-iis-default-app-pool-recycle-set-to-1740-minutes
浅谈asp.net session time out问题