调试过程中Session丢失问题的解决

在近期开发程序的过程了,放弃了微软自带的membership。登录采用了form验证。并为了用户信息的保存方便和数据库压力的减轻,采用的Session存储数据。

可是在调试的过程中发现Session发生了错误,返回的值都是自定义捕捉错误后返回的值。经过研究发现是Session丢失了。于是对Asp.net中的Session机制进行了研究。

对于Session的失效或者丢失,那么具体出现这种情况的问题主要有:
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的时间设置是不是有问题,会不会因为超时造成丢失

那么关于调试过程中Session丢失的问题,最大的可能性就是原因1,经过反复实验,确定丢失的原因是第一个。

这个时候就必须对Session中存储的值是否是我们需要的值进行判断。

以此类推,在以前部署或者跟新网站的过程中也发生过用户输入的信息丢失,最后发现不是丢失,而是将该用户的ID存储成了-1(一般对Session读取出现错误时返回的值),那么可能就是更新的过程中发生的Session丢失。由于问题并没有重复发生,所以并没有在意,现在这样的问题再次出现,该引起重视了。

所以,在对网站或者项目进行更新的过程中,最好采用彻底断线更新,避免此类问题发生。另外对每次Session读取后进行必要的值范围判断也是非常有必要的。

你可能感兴趣的:(session)