检查ASPNET Session是否失效是否超时默认是分钟设置的方法是SessionTimeOut=;或者您可以设置到更高这个数值的单位是分钟大家视情况而定
检查代码有无SessionAbandon()之类的一旦调用 Abandon 方法当前会话不再有效同时会启动新的会话
ASPNET中使用了ACCESS数据库而且数据库是放在bin目录中的解决方法是不要放会更新的文件在BIN目录中
从同一个页面传到另一个页面才能延续同一个session也就是说session不可跨域同时客户端一关闭浏览器或一关闭浏览页 Session也消失了再次访问时又会创建新的Session 但还会在服务器上存活等待超时只是调用不到了 另外比如在第一个页面置了SESSION然后REDIRECT去第二个页面解决方法是在REDIRECT中设置endResponse为FALSE
Iframe丢Session的原因session是客户端和服务器端共同认证的客户端存储标识通过附加在页面的头发送给服务器端服务器进行识别如果符合条件就可以获得相应的session操作权
但如果页面是来自框架的而框架的父页和框架不是一个站点的话客户端默认是禁止向页面附加头信息的这样服务器端就无法识别客户端框架里面的页面自然不能操作Session解决办法: ResponseAddHeader(PP CP=CAO PSA OUR) 或者在Window服务中将 State Service 启动
有些杀病毒软件会去扫描您的WebConfig文件那时Session肯定掉这是微软的说法解决办法: 使杀病毒软件屏蔽扫描WebConfig文件(程序运行时自己也不要去编辑它)
ASPNET默认配置下Session莫名丢失的原因及解决办法
正常操作情况下Session会无故丢失因为程序是在不停的被操作排除Session超时的可能另外Session超时时间被设定成分钟不会这么快就超时的
现在我就把原因和解决办法写出来
ASPNET Session失效的原因
由于程序是默认配置所以WebConfig文件中关于Session的设定如下
<sessionStatemode=InProcstateConnectionString=tcpip=:
sqlConnectionString=datasource=;Trusted_Connection=yescookieless=true
timeout=/>
我们会发现sessionState标签中有个属性mode它可以有种取值InProcStateServer?SQLServer(大小写敏感)默认情况下是InProc也就是将Session保存在进程内(IIS是aspnet_wpexe而IIS是Wwpexe)这个进程不稳定在某些事件发生时进程会重起所以造成了存储在该进程内的Session丢失
哪些情况下该进程会重起呢?微软的一篇文章告诉了我们
配置文件中processModel标签的memoryLimit属性
Globalasax或者nfig文件被更改
Bin文件夹中的Web程序(DLL)被修改
杀毒软件扫描了一nfig文件
更多的信息请参考PRB: Session variables are lost intermittently in applications
ASPNET Session失效的解决办法
前面说到的sessionState标签中mode属性可以有三个取值除了InProc之外还可以为StateServerSQLServer这两种存Session的方法都是进程外的所以当aspnet_wpexe重起的时候不会影响到Session
现在请将mode设定为StateServerStateServer是本机的一个服务可以在系统服务里看到服务名为 State Service的服务默认情况是不启动的当我们设定mode为StateServer之后请手工将该服务启动
这样我们就能利用本机的StateService来存储Session了除非电脑重启或者StateService崩掉否则Session是不会丢的(因Session超时被丢弃是正常的)
除此之外我们还可以将Session通过其他电脑的StateService来保存具体的修改是这样的同样还在sessionState标签中有个stateConnectionString=tcpip=:属性其中有个ip地址默认为本机()你可以将其改成你所知的运行了StateService服务的电脑IP这样就可以实现位于不同电脑上的程序互通Session了
如果你有更高的要求需要在服务期重启时Session也不丢失可以考虑将mode设定成SQLServer同样需要修改sqlConnectionString属性关于使用SQLServer保存Session的操作在使用StateServer或者SQLServer存储Session时所有需要保存到Session的对象除了基本数据类型(默认的数据类型如intstring等)外都必须序列化只需将[Serializable]标签放到要序列化的类前就可以了
如
[Serializable]
publicclassMyClass
{
}