防止Session丢失方法整理

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/p/3885227.html