tonyqus.cn

休养中..
随笔 - 202, 文章 - 1, 评论 - 1204, 引用 - 57
数据加载中……

关于asp.net Session丢失问题的总结

更完整的关于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

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

posted on 2006-04-19 10:33 Tony Qu 阅读(10297) 评论(26)  编辑 收藏 所属分类: .NET 1.1 技术

评论

#1楼    回复  引用  查看    

总结的不错,呵呵
2006-04-19 11:37 | Bear.sTaR{R}      

#2楼    回复  引用  查看    

这样才能进步啊...不错!
2006-04-19 11:44 | 萧远山      

#3楼    回复  引用  查看    

嗯,人有时候需要外界刺激一下才会激发潜能,:)
2006-04-19 13:04 | 老燕      

#4楼    回复  引用  查看    

这个比较全面了。
2006-04-19 13:22 | 川仔      

#5楼    回复  引用  查看    

好,看后很有收获。看来不受刺激是不行了~
2006-04-19 13:29 | Boler Guo      

#6楼    回复  引用  查看    

Session篡位又是怎么发生的呢? 偶碰到过一次,点击注销后(程序会清空当前session),返回首页,居然显示的是别人帐号的信息 (本来应该什么都不显示的) ...... 就碰巧看到过一次!!!!! PS:Session记录的是UserID(唯一的)
2006-04-19 14:01 | flyye_cs      

#7楼    回复  引用  查看    

Session存到数据库里便是不是就不容易丢失了?
2006-04-19 15:01 | 辉狼      

#8楼    回复  引用  查看    

不会是熊力面试的你吧?eparg的blog上面有详细地总结
2006-04-19 15:27 | 鞠强      

#9楼 [楼主]   回复  引用  查看    

@鞠强
不知道呀,我没问面我的几个的名字,只知道面我的manager叫于雯,不过觉得面我的人都很专业的,不愧是GTSC的,佩服佩服

@辉狼
恩,相对于不用数据库的Session应用而言安全些
2006-04-19 20:03 | Tony Qu      

#10楼 [楼主]   回复  引用  查看    

@砖头
虚心接受意见,那你说说我应该怎么总结,我需要的是意见,砖头我不要:p
2006-04-21 20:10 | Tony Qu      

#11楼    回复  引用    

还有一种情况,但是是由人为因素造成的

记得有几个页面不小心把页面上的引用using System.Web.SessionState;给删除了,
在运行中发现Session通常莫名其妙的丢失,找了很久也没发现原因
页面也不是每次都出错,因此谁也没有想到为是这个原因造成的

另 没有加该引用页面也不会报错

:)


2006-04-24 08:56 | 00000000000 [未注册用户]

#12楼    回复  引用  查看    

楼主的第三个方法我最支持!呵呵
2006-04-26 09:15 | 极地银狐.NET      

#13楼    回复  引用  查看    

web.config 一变动session好像也要丢失~
2006-04-30 09:41 | Boler Guo      

#14楼    回复  引用    

re: flyye_cs

1. 可能是服务端将sessionID放在了url里(禁用了cookies)
2. 页面缓存,你碰到的应该是这个

感觉楼主总结的几个方案都会有性能问题,因为session的操作太频繁了!一般对于session的丢失是不会去处理的!
2006-05-09 16:12 | ashuai [未注册用户]

#15楼    回复  引用  查看    

我也出现过SESSION串位情况,但不知怎么回事。
2006-06-07 13:55 | SPARON      

#16楼    回复  引用  查看    

我还遇到一个问题,现在还在困绕我.
我把一个大概有1000条记录的表中数据(该数据程序是已经进行计算过)存放在Session中,我会频繁修改该该Session.问题就出来了.同样的操作,在不同的时候会出现该表Session中DataTable的记录数为0.我没有搞懂是为什么的.如有人指点,在下不胜感激.
2006-06-17 12:18 | 凌风      

#17楼    回复  引用    

非常感谢帮我解决了问题
2006-06-20 09:03 | 性 [未注册用户]

#18楼    回复  引用    

我的程序中有一段删除文件夹的代码,每次执行后seesion就没了,是怎么回事呢?
2006-06-22 14:39 | 幻影杀手 [未注册用户]

#19楼    回复  引用    

http://spaces.msn.com/eparg/Blog/cns!1pnPgEC6RF6WtiSBWIHdc5qQ!447.entry


难道真的是我面试的?总结的东西跟我blog上的好相似啊

楼主继续努力!
2006-07-20 16:24 | grapef [未注册用户]

#20楼    回复  引用    

说有道理。
我现在正好用得着!
2006-08-28 17:29 | 曹爷 [未注册用户]

#21楼    回复  引用    

我的程序中有一段删除文件夹的代码,每次执行后seesion就没了,是怎么回事呢?
我也碰到這個問題啊?暈死!
2006-10-05 17:13 | 風林火山 [未注册用户]

#22楼    回复  引用    

_blank 打开一个页面就丢失了,怎么回事???
2007-06-26 16:51 | dejack [未注册用户]

#23楼    回复  引用    

总结的不错,呵呵
2007-08-09 20:01 | myds [未注册用户]

#24楼    回复  引用    

无法向会话状态服务器发出会话状态请求。请确保 ASP.NET State Service (ASP.NET 状态服务)已启动,并且客户端端口与服务器端口相同。如果服务器位于远程计算机上,请检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection 的值,确保服务器接受远程请求。如果服务器位于本地计算机上,并且上面提到的注册表值不存在或者设置为 0,则状态服务器连接字符串必须使用“localhost”或“127.0.0.1”作为服务器名称。


我设置成那个了,但现在出现了上面的问题!
2007-09-18 10:20 | 小朋 [未注册用户]

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-29 06:51 编辑过


相关链接: