.NET的Session老不定时的过期

时间:2022-01-01 03:01:33
原因:是这样的,我用Session记录用户登录的ID,如Session["UserID"] = “从数据库中读取的用户ID”,那我当然用它去判断了
If(Session["UserID"] == null)
{
    Response.Redirect("Login.aspx");//如果用户没登录了就返回登录页
}
但我发现我没显式的释放Session,过一会或者我刷新几次本页,就自动把我踢到Login.aspx,我想是Session超时了,
可我在IIS里设置的是30分钟,在Web.config里设置的也是设置了很长时间如 “<sessionState timeout="600"></sessionState>”
那杂有时候没几分钟就被转到Login.aspx,有时过半个多小时才被踢到Login.aspx。很不稳定。
请各位大虾指教,不甚感激。告诉我为什么?

12 个解决方案

#1


1.asp.net的session过期是不同于asp的,就算你设置了过期时间是20分钟,也到不了20分钟。因为当系统资源不足时,asp.net会回收进程,当进程回收session就不存在了,如果在虚拟主机上这种回收是很快的。如果你有好几台服务嚣用负载平衡的话。这种问题也常发生。 
2.解决方法,使用专用的session存储session或sql存储,asp.net支持这些方法。设置方法见msdn 
3.建议,使用加密的cookie存储这些数据。减少服务嚣的负担和开支,支持率高。方便。

#2


没办法啊。。。没办法。。呵呵

#3


说过无数次了,那不叫做“过期”,那叫做“丢失”。

当你说那是“过期”,也就按照自欺欺人的“过期”规则去看问题了,肯定是瞎联想到有关设置过期时间之类的方面上去了。

去了解Session为什么会丢失吧!我可以很可信地告诉你,如果你租用空间商的虚拟主机,那么每隔8~15分钟就丢失一次所有Session集合、Application集合、所有static变量值等事情,这是很正常的网站维护行为。

所以不要轻信那些在个人电脑上玩一玩开发环境、练手的入门书上的资料。要结合你的应用部署的服务器特性来处理这个“丢失”问题。

#4


Session 最大BUG 就是容易丢失,,,使用专用的session存储session或sql存储,asp.net支持这些方法

#5


Session的Bug?什么意思?

这个跟Session也没有必然关系,因为连Application集合、所有static变量,也都“丢失”了。

相反地,IIS、asp.net,都有msdn等等许多文档讲过应用程序状态管理中InProc模式下会有上百种数不尽的情况下会随时重启应用程序的设计。文档中清晰地说明了应用程序会重启,所以说如果你认为是Session的bug只能说是你编程缺乏实践经验,被那些入门书的作者用简单化的方法忽悠了。

#6


一楼和3楼说的都有道理,最近我再用ASP.NET开发项目在本地的虚拟主机测试也是老是出现这个情况,Session不定时丢失,估计要用加密的cookies来做用户登陆后的标记比较可靠,顶

#7


关于asp.net Session丢失问题的总结
http://tonyqus.cnblogs.com/archive/2006/04/19/378904.html

更完整的关于asp.net session 丢失问题的帖子请见下文:

理解Session State模式+ASP.NET SESSION丢失FAQ [翻译]

asp中Session的工作原理:
asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

asp.net Session的实现
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。

原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式

解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失

参考:
[1] http://jinglecat.cnblogs.com/archive/2005/11/14/275587.aspx
[2] http://www.0dsf.com/bbs/dispbbs.asp?boardID=30&ID=6032&page=5
[3] http://spaces.msn.com/eparg/Blog/cns!1pnPgEC6RF6WtiSBWIHdc5qQ!447.entry
[4] http://jinlinc.cnblogs.com/archive/2005/11/29/287181.aspx
[5] http://blog.joycode.com/ghj/archive/2004/06/23/25521.aspx
[6] http://www.365base.com/Article/343/347/2005/2005091534671.html

大家如果还有其他的经验,可以写在回复中,我会即时更新的。 

#8


还有一个圡办法,登录页面的时候把UserID同时记到Session和ViewState(或者HidenField控件)里面。

判断如果Session为空就从ViewState(或者HidenField控件)里面把UserID取出来再放到Session里面。

#9


开启asp.net服务

#10


多谢,多谢1,3,7楼,还有大家所有人。我在Web.config里把Session保存在StateServer,并到services.msc下开启了ASP.NET状态服务。目前本地测试刷新了50遍,吃了个饭,还是好的。不知道传到服务器上会否一样好的。又长知识了,成天光知道写代码,对他的机制一点不了解,真是惭愧

#11


session丢失最大的原因大家可能都忽略了。文件夹改动会引起重新启动。所以上传等最好放在其他文件夹。

#12


该回复于2010-12-03 10:17:25被版主删除

#1


1.asp.net的session过期是不同于asp的,就算你设置了过期时间是20分钟,也到不了20分钟。因为当系统资源不足时,asp.net会回收进程,当进程回收session就不存在了,如果在虚拟主机上这种回收是很快的。如果你有好几台服务嚣用负载平衡的话。这种问题也常发生。 
2.解决方法,使用专用的session存储session或sql存储,asp.net支持这些方法。设置方法见msdn 
3.建议,使用加密的cookie存储这些数据。减少服务嚣的负担和开支,支持率高。方便。

#2


没办法啊。。。没办法。。呵呵

#3


说过无数次了,那不叫做“过期”,那叫做“丢失”。

当你说那是“过期”,也就按照自欺欺人的“过期”规则去看问题了,肯定是瞎联想到有关设置过期时间之类的方面上去了。

去了解Session为什么会丢失吧!我可以很可信地告诉你,如果你租用空间商的虚拟主机,那么每隔8~15分钟就丢失一次所有Session集合、Application集合、所有static变量值等事情,这是很正常的网站维护行为。

所以不要轻信那些在个人电脑上玩一玩开发环境、练手的入门书上的资料。要结合你的应用部署的服务器特性来处理这个“丢失”问题。

#4


Session 最大BUG 就是容易丢失,,,使用专用的session存储session或sql存储,asp.net支持这些方法

#5


Session的Bug?什么意思?

这个跟Session也没有必然关系,因为连Application集合、所有static变量,也都“丢失”了。

相反地,IIS、asp.net,都有msdn等等许多文档讲过应用程序状态管理中InProc模式下会有上百种数不尽的情况下会随时重启应用程序的设计。文档中清晰地说明了应用程序会重启,所以说如果你认为是Session的bug只能说是你编程缺乏实践经验,被那些入门书的作者用简单化的方法忽悠了。

#6


一楼和3楼说的都有道理,最近我再用ASP.NET开发项目在本地的虚拟主机测试也是老是出现这个情况,Session不定时丢失,估计要用加密的cookies来做用户登陆后的标记比较可靠,顶

#7


关于asp.net Session丢失问题的总结
http://tonyqus.cnblogs.com/archive/2006/04/19/378904.html

更完整的关于asp.net session 丢失问题的帖子请见下文:

理解Session State模式+ASP.NET SESSION丢失FAQ [翻译]

asp中Session的工作原理:
asp的Session是具有进程依赖性的。ASP Session状态存于IIS的进程中,也就是inetinfo.exe这个程序。所以当inetinfo.exe进程崩溃时,这些信息也就丢失。另外,重起或者关闭IIS服务都会造成信息的丢失。

asp.net Session的实现
asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做状态维护的,因此用HttpModule做Session是再合适不过了。

原因1:
bin目录中的文件被改写,asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:
文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:
似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:
Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:
IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:
使用web garden模式,且使用了InProc mode作为保存session的方式

解决丢失的经验
1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间
2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多
3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失
4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。
5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失

参考:
[1] http://jinglecat.cnblogs.com/archive/2005/11/14/275587.aspx
[2] http://www.0dsf.com/bbs/dispbbs.asp?boardID=30&ID=6032&page=5
[3] http://spaces.msn.com/eparg/Blog/cns!1pnPgEC6RF6WtiSBWIHdc5qQ!447.entry
[4] http://jinlinc.cnblogs.com/archive/2005/11/29/287181.aspx
[5] http://blog.joycode.com/ghj/archive/2004/06/23/25521.aspx
[6] http://www.365base.com/Article/343/347/2005/2005091534671.html

大家如果还有其他的经验,可以写在回复中,我会即时更新的。 

#8


还有一个圡办法,登录页面的时候把UserID同时记到Session和ViewState(或者HidenField控件)里面。

判断如果Session为空就从ViewState(或者HidenField控件)里面把UserID取出来再放到Session里面。

#9


开启asp.net服务

#10


多谢,多谢1,3,7楼,还有大家所有人。我在Web.config里把Session保存在StateServer,并到services.msc下开启了ASP.NET状态服务。目前本地测试刷新了50遍,吃了个饭,还是好的。不知道传到服务器上会否一样好的。又长知识了,成天光知道写代码,对他的机制一点不了解,真是惭愧

#11


session丢失最大的原因大家可能都忽略了。文件夹改动会引起重新启动。所以上传等最好放在其他文件夹。

#12


该回复于2010-12-03 10:17:25被版主删除