ASP.NET处理Session丢失
-----------------------------------------------------引言开始-----------------------------------------------------
事情的起因是站点出现未登陆的假象,点着点着就跳到登陆页或提示用户登陆。
因为很多页面都继承了一个PageBase类,这个类会判断用户是否登陆如果没有登陆就会提示用户登陆或则直接跳转到登陆页面,而记录用
户状态是方法是用Session来存储用户的Id,站点出现这种情况就是说用户的Id没有取到,首先想到是代码的问题,于是把代码翻出来反复
看了几遍,也在本机调试了N遍都没出现线上的问题。
这下就开始纳闷了,由于刚开始管理服务器这问题还是我第一次遇到,经历了一天的调试第一天就这样过了,第二天的上午也没有能解
决,中午和几个同事去健身回来就趴着睡了会儿,这时候奇迹发生了,我也不知道为什么我会想到Session丢失(其实这个问题已经有N多人
遇到了,而且解决了-_-!),于是就在Google里键入"ASP.NET Session丢失",接下来一切就顺其自然的发生了。。。。。
-----------------------------------------------------引言结束-----------------------------------------------------
-----------------------------------------------------正题开始-----------------------------------------------------
首先找到Web.config里面的sessionState节点默认差不多是:
然后把它改成:
先别着急着试,还有:在设置成这样后需要开启"ASP.NET State Service"服务步骤是:
打开运行输入 "services.msc"
或则
我的电脑右键→管理→服务和应用程序→服务
然后找到"ASP.NET State Service"将其设置为自动,并将服务开启。
由此关于我的问题就这样解决了。
同样希望你的也是。
-----------------------------------------------------正题结束-----------------------------------------------------
-----------------------------------------------------其它开始-----------------------------------------------------
以上配置是针对东西都在同一台服务器上的,对于将Session存储于不同服务器上的朋友可能需要这样设置了。
运行 regedit → 打开注册表 → 找到
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/aspnet_state/Parameters 节点 → 将
AllowRemoteConnection 的键值设置成“1”(1 为允许,0 代表禁止)→ 设置 Port (端口号)
之所以说可能是因为我没有亲自试过,样设置的主要原因就是为了使stateConnectionString属性可以支持其他地址的一个开关如果你
不会用到其他服务器上的东西,那么上面的stateConnectionString也可以不写。
预计会出现的连带问题
第一个:
从提示上就已经能看出问题的所在了,就按照"其他开始"的地方做就可以了。
第二个:
出现这个问题是因为Session在存储Class的时候没有在类上面加上[Serializable],加上后就能存储了。
就是说你需要将那个类存到Session里面就必须将这个类序列化。
简单介绍下mode的属性
1.不使用(Off),
这个就不必多说了,呵呵呵。。。。。
2.进程内(InProc),
Session会与进程名为"w3wp.exe"在一起,而这个进程会经常自动重启,或则网站一些改动后就会重启。
3.状态服务器(StateServer),
当开启"ASP.NET State Service"后进程里面会出现一个名叫"aspnet_state.exe"的进程,与之关联的所有Session都会储存在这里,
只要这个进程不死Session就不会消失,当然过期除外。
4.SQLServer数据库(SQLServer),
5.自定义(Custom)
这里还找到几个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的方式
-----------------------------------------------------其它结束-----------------------------------------------------