原因:是这样的,我用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。很不稳定。
请各位大虾指教,不甚感激。告诉我为什么?
以下为回答1:
1.asp.net的session过期是不同于asp的,就算你设置了过期时间是20分钟,也到不了20分钟。因为当系统资源不足时,asp.net会回收进程,当进程回收session就不存在了,如果在虚拟主机上这种回收是很快的。如果你有好几台服务嚣用负载平衡的话。这种问题也常发生。
2.解决方法,使用专用的session存储session或sql存储,asp.net支持这些方法。设置方法见msdn
3.建议,使用加密的cookie存储这些数据。减少服务嚣的负担和开支,支持率高。方便。
回答2:
说过无数次了,那不叫做“过期”,那叫做“丢失”。
当你说那是“过期”,也就按照自欺欺人的“过期”规则去看问题了,肯定是瞎联想到有关设置过期时间之类的方面上去了。
去了解Session为什么会丢失吧!我可以很可信地告诉你,如果你租用空间商的虚拟主机,那么每隔8~15分钟就丢失一次所有Session集合、Application集合、所有static变量值等事情,这是很正常的网站维护行为。
所以不要轻信那些在个人电脑上玩一玩开发环境、练手的入门书上的资料。要结合你的应用部署的服务器特性来处理这个“丢失”问题。
有人说是Session的Bug?什么意思?
这个跟Session也没有必然关系,因为连Application集合、所有static变量,也都“丢失”了。
相反地,IIS、asp.net,都有msdn等等许多文档讲过应用程序状态管理中InProc模式下会有上百种数不尽的情况下会随时重启应用程序的设计。文档中清晰地说明了应用程序会重启,所以说如果你认为是Session的bug只能说是你编程缺乏实践经验,被那些入门书的作者用简单化的方法忽悠了。
回答3(提问者最后解决) 这个问题本人也是这样解决过
我在Web.config里把Session保存在StateServer,并到services.msc下开启了ASP.NET状态服务。目前本地测试刷新了50遍,吃了个饭,还是好的。不知道传到服务器上会否一样好的。又长知识了,成天光知道写代码,对他的机制一点不了解,真是惭愧