background image

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

本文分析了 ASP.NET Session 丢失问题的原因及解决方案。asp 的 Session 是具有进程
依赖性的。ASP Session 状态存于 IIS 的进程中,也就是 inetinfo.exe 这个程序。

正常操作情况下会有 ASP.NET Session 丢失的情况出现。因为程序是在不停的被操

作,排除 Session 超时的可能。另外,Session 超时时间被设定成 60 分钟,不会这么快
就超时的。

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

ASP.NET Session 丢失原因:

由于 Asp.net 程序是默认配置,所以 Web.Config 文件中关于 Session 的设定如下:

< sessionState mode='InProc' 

stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data 
source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

我们会发现 sessionState 标签中有个属性 mode,它可以有 3 种取值:

InProc、StateServer?SQLServer

 

(大小写敏感) 。默认情况下是 InProc,也就是将

Session 保存在进程内(IIS5 是 aspnet_wp.exe,而 IIS6 是 W3wp.exe),这个进程
不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的 Session 丢失。

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

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

2、Global.asax 或者 Web.config 文件被更改

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

4、杀毒软件扫描了一些.config 文件。

更多的信息请参考 PRB: Session variables are lost intermittently in ASP.NET 

applications

ASP.NET Session 丢失解决办法:

前面说到的 sessionState 标签中 mode 属性可以有三个取值,除了 InProc 之外,

还可以为 StateServer、SQLServer。这两种存 Session 的方法都是进程外的,所以当
aspnet_wp.exe 重起的时候,不会影响到 Session。

现在请将 mode 设定为 StateServer。StateServer 是本机的一个服务,可以在系统

服务里看到服务名为 ASP.NET State Service 的服务,默认情况是不启动的。当我们设
定 mode 为 StateServer 之后,请手工将该服务启动。

这样,我们就能利用本机的 StateService 来存储 Session 了,除非电脑重启或者

StateService 崩掉,否则 Session 是不会丢的(因 Session 超时被丢弃是正常的)。

除此之外,我们还可以将 Session 通过其他电脑的 StateService 来保存。具体的修

改是这样的。同样还在 sessionState 标签中,有个