Session的使用不可避免的需要注意其丢失情况,这几天在网上搜集的一些丢失Session的原因及解决办法,整理如下:
1.Session超时后自动丢失
解决:查看Session是否是超时后被清除,如需设置超时时间,可在web.config的sessionState节点中设置,此节点在下面有介绍
2. 检查代码有无让Session主动丢失的代码
解决:比如有无Session.Abandon()之类的代码
3.cookie数量限制可能导致Session的丢失
解决:Cookie的数量限制与每个浏览器有关
4. 服务器内存不足导致Session丢失
解决:可修改配置文件中processModel标签的memoryLimit属性,该属性默认为60%。
标签位置在<system.web>中,如下所示:
<processModel memoryLimit="60" />
该属性指在 ASP.NET 启动新进程和重新分配现有请求前,辅助进程可以使用的最大内存大小
亦可考虑使用第5点解决
5.进程的重启导致Session丢失
asp.net有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有DLL文件或者其他文件(Global.asax、Web.config)被动态改写,就会导致Session丢失
因此引起进程重启的原因可能有:
1. 有些杀毒软件会去扫描您的Web.Config文件,会导致丢失Session
2. Global.asax或者Web.config文件被程序动态修改或者项目bin文件夹中的Web程序(DLL)被动态修改
解决:
(1)检查杀毒软件是否在扫描你的Web.config文件,导致Session丢失,如果是可设置杀毒软件屏蔽扫描Web.Config文件
(2)检查自己的程序,避免有动态修改Global.asax、Web.config文件的地方
(3) 刷新页面的时候,跟踪bin中某个文件的修改时间,确定是不是某个DLL被修改而导致Session丢失
(4)更改Session的存储位置(session默认是存放在web进程里的)
sessionState节点:
位置:<system.web>节点中
<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="true" timeout="60"/>
属性mode有3种取值:InProc、StateServer、SQLServer(大小写敏感)。
默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重启,所以造成了存储在该进程内的Session丢失。
而StateServer、SQLServer这两种都是将Session存储到进程外的,所以当aspnet_wp.exe或w3wp.exe重启的时候,不会影响到Session
StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动
这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者Asp.Net StateService坏掉,否则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属性。
在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。
如:
[Serializable]
public class MyClass
{
......
}
以上参考:http://www.cnblogs.com/nick-fbx/archive/2008/11/14/1333244.html
个人整理,以备查阅,如有不对,欢迎拍砖!
来源:https://www.cnblogs.com/adayywq/archive/2008/02/26/3885227.html