asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET Session丢失问题原因及解决方案


发布日期:2022年11月10日
 
ASP.NET Session丢失问题原因及解决方案

正常操作情况下会有ASPNET Session丢失的情况出现因为程序是在不停的被操作排除Session超时的可能另外Session超时时间被设定成分钟不会这么快就超时的

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

ASPNET Session丢失原因

由于Aspnet程序是默认配置所以WebConfig文件中关于Session的设定如下

                                    

<sessionState mode=InProc  stateConnectionString=tcpip=: sqlConnectionString=data  source=;Trusted_Connection=yes cookieless=true  timeout=/>

                        

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

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们

配置文件中processModel标签的memoryLimit属性

Globalasax或者Webconfig文件被更改

Bin文件夹中的Web程序(DLL)被修改

杀毒软件扫描了一些config文件

更多的信息请参考PRB: Session variables are lost intermittently in ASPNET applications

ASPNET Session丢失解决办法

前面说到的sessionState标签中mode属性可以有三个取值除了InProc之外还可以为StateServer SQLServer这两种存Session的方法都是进程外的所以当aspnet_wpexe重起的时候不会影响到Session

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

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

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

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

在使用StateServer或者SQLServer存储Session时所有需要保存到Session的对象除了基本数据类型(默认的数据类型如intstring等)外都必须序列化只需将[Serializable]标签放到要序列化的类前就可以了

                                    

[Serializable]

            

public class MyClass

            

{

            

            

}

                        

具体的序列化相关的知识请参这里

至此ASPNET Session丢失问题解决

关于aspnet Session丢失问题的总结

asp中Session的工作原理

asp的Session是具有进程依赖性的ASP Session状态存于IIS的进程中也就是inetinfoexe这个程序所以当inetinfoexe进程崩溃时这些信息也就丢失另外重起或者关闭IIS服务都会造成信息的丢失

aspnet Session的实现

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

原因

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

原因

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

原因

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

原因

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

原因

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

原因

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

ASPNET Session丢失问题解决经验

判断是不是原因造成的可以在每次刷新页面的时候跟蹤bin中某个文件的修改时间

做Session读写日志每次读写Session都要记录下来并且要记录SessionIDSession值所在页面当前函数函数中的第几次Session操作这样找丢失的原因会方便很多

如果允许的话建议使用state server或sql server保存session这样不容易丢失

在globalasa中加入代码记录Session的创建时间和结束时间超时造成的Session丢失是可以在SessionEnd中记录下来的

如果有些代码中使用客户端脚本如javascript维护Session状态就要尝试调试脚本是不是因为脚本错误引起Session丢失(来源杰之蓝)

               

上一篇:ASP.NET中读写cookie数据示例代码

下一篇:ASP.NET及JS中的cookie基本用法