.NET的Session老不定时的过期

孟林-David.Meng 2009-03-16 10:57:41
原因:是这样的,我用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。很不稳定。
请各位大虾指教,不甚感激。告诉我为什么?
...全文
1805 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilqtj 2010-05-27
  • 打赏
  • 举报
回复
session丢失最大的原因大家可能都忽略了。文件夹改动会引起重新启动。所以上传等最好放在其他文件夹。
  • 打赏
  • 举报
回复
开启asp.net服务
gutty 2009-03-17
  • 打赏
  • 举报
回复
还有一个圡办法,登录页面的时候把UserID同时记到Session和ViewState(或者HidenField控件)里面。

判断如果Session为空就从ViewState(或者HidenField控件)里面把UserID取出来再放到Session里面。
gutty 2009-03-17
  • 打赏
  • 举报
回复
关于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

大家如果还有其他的经验,可以写在回复中,我会即时更新的。
孟林-David.Meng 2009-03-17
  • 打赏
  • 举报
回复
多谢,多谢1,3,7楼,还有大家所有人。我在Web.config里把Session保存在StateServer,并到services.msc下开启了ASP.NET状态服务。目前本地测试刷新了50遍,吃了个饭,还是好的。不知道传到服务器上会否一样好的。又长知识了,成天光知道写代码,对他的机制一点不了解,真是惭愧
盛米网络 2009-03-16
  • 打赏
  • 举报
回复
一楼和3楼说的都有道理,最近我再用ASP.NET开发项目在本地的虚拟主机测试也是老是出现这个情况,Session不定时丢失,估计要用加密的cookies来做用户登陆后的标记比较可靠,顶
  • 打赏
  • 举报
回复
Session的Bug?什么意思?

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

相反地,IIS、asp.net,都有msdn等等许多文档讲过应用程序状态管理中InProc模式下会有上百种数不尽的情况下会随时重启应用程序的设计。文档中清晰地说明了应用程序会重启,所以说如果你认为是Session的bug只能说是你编程缺乏实践经验,被那些入门书的作者用简单化的方法忽悠了。
程序漫步 2009-03-16
  • 打赏
  • 举报
回复
Session 最大BUG 就是容易丢失,,,使用专用的session存储session或sql存储,asp.net支持这些方法
  • 打赏
  • 举报
回复
说过无数次了,那不叫做“过期”,那叫做“丢失”。

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

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

所以不要轻信那些在个人电脑上玩一玩开发环境、练手的入门书上的资料。要结合你的应用部署的服务器特性来处理这个“丢失”问题。
小_虎 2009-03-16
  • 打赏
  • 举报
回复
没办法啊。。。没办法。。呵呵
teerhu 2009-03-16
  • 打赏
  • 举报
回复
1.asp.net的session过期是不同于asp的,就算你设置了过期时间是20分钟,也到不了20分钟。因为当系统资源不足时,asp.net会回收进程,当进程回收session就不存在了,如果在虚拟主机上这种回收是很快的。如果你有好几台服务嚣用负载平衡的话。这种问题也常发生。
2.解决方法,使用专用的session存储session或sql存储,asp.net支持这些方法。设置方法见msdn
3.建议,使用加密的cookie存储这些数据。减少服务嚣的负担和开支,支持率高。方便。

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧