Session丢失的解决办法小结(转nick-fbx)

最近在做ASP.NET项目时,测试网站老是取不出Session中的值,在网上搜索了一下,找到一些解决方法,记录在这里。最后使用存储在StateServer中的办法解决了问题。




SessionState Timeout) ,其主要原因有三种

一:有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。
二:程序内部里有让Session掉失的代码,及服务器内存不足产生的。
三:程序有框架页面和跨域情况。

第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时自己也不要去编辑它 )
第二种是检查代码有无Session.Abandon()之类的。
第三种是在Window服务中将ASP.NET State Service 启动。

今天遇到asp.net session丢失了,然后又回来了,session里存储的是用户信息,最后导致每次刷新是不同的用户或是未登录状态。很让人吐血的问题。
搞了2天没搞出来,最后重写了验证机制,都放在了cookie里了,session不敢用了。
今天发现,问题是由于设置iis6的 应用程序池内的性能内的最大web进程数导致的,由于session默认是存放在web进程里的,进程开多了,导致session不能共享,每次刷新又由 不同的进程来处理,所以就导致刷新出来不同的用户,前提是在本机登录过这些用户。
解决方法可以用stateserver或者用sqlserver模式来存储session。
由于google没搜到类似问题,所以这里拿出来说一下这个让我头痛了2天,最后修改了n多页面的问题。



asp.net session 丢失网上收集
Asp.net 默认配置下,Session 莫名丢失的原因及解决办法
正常操作情况下Session 会无故丢失。因为程序是在不停的被操作,排除Session 超时的可能。另外,Session 超时时间被设定成60 分钟,不会这么快就超时的。

这次到CSDN 上搜了一下帖子,发现好多人在讨论这个问题,然后我又google 了一下,发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。


原因:
由于Asp.net 程序是默认配置,所以Web.Config 文件中关于Session 的设定如下:
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

我们会发现sessionState 标签中有个属性mode ,它可以有3 种取值:InProcStateServer?SQLServer (大小写敏感)。默认情况下是InProc ,也就是将Session 保存在进程内(IIS5aspnet_wp.exe ,而IIS6W3wp.exe ),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session 丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:
1 、配置文件中processModel 标签的memoryLimit 属性
2Global.asax 或者Web.config 文件被更改
3Bin 文件夹中的Web 程序(DLL )被修改
4 、杀毒软件扫描了一些.config 文件。
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:
前面说到的sessionState 标签中mode 属性可以有三个取值,除了InProc 之外,还可以为StateServerSQLServer 。这两种存Session 的方法都是进程外的,所以当aspnet_wp.exe 重起的时候,不会影响到Session

现在请将mode 设定为StateServerStateServer 是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service 的服务,默认情况是不启动的。当我们设定modeStateServer 之后,请手工将该服务启动。

这样,我们就能利用本机的StateService 来存储Session 了,除非电脑重启或者StateService 崩掉,否则Session 是不会丢的(因Session 超时被丢弃是正常的)。

除此之外,我们还可以将Session 通过其他电脑的StateService 来保存。具体的修改是这样的。同样还在sessionState 标签中,有个stateConnectionString='tcpip=127.0.0.1:42424' 属性,其中有个ip 地址,默认为本机(127.0.0.1 ),你可以将其改成你所知的运行了StateService 服务的电脑IP ,这样就可以实现位于不同电脑上的Asp.net 程序互通Session 了。

如果你有更高的要求,需要在服务期重启时Session 也不丢失,可以考虑将mode 设定成SQLServer ,同样需要修改sqlConnectionString 属性。关于使用SQLServer 保存Session 的操作,请访问这里。

在使用StateServer 或者SQLServer 存储Session 时,所有需要保存到Session 的对象除了基本数据类型(默认的数据类型,如intstring 等)外,都必须序列化。只需将[Serializable] 标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
    ......
}
具体的序列化相关的知识请参这里。

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

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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值