您的位置:首页 > 编程语言 > ASP

删除文件目录导致ASP.NET Session丢失的解决方案

2013-05-18 10:47 531 查看
最近从测试人员反馈过来的bug中,发现了一个问题,那就是session丢失的问题,session为什么会丢失呢?session一般会在什么时候丢失呢?丢失了我们改怎么处理呢?

一、现象

在我们的系统中,用户可以创建一个目录结构到服务器上,而且可以删除自己创建的目录,测试人员发现当删除了目录后,系统的session就丢失了,当用户继续进行操作时就会跳转到登陆页面进行重新登陆。

监测到的异常信息:<b> 异常详细信息: </b>System.Web.HttpException: 无法序列化会话状态。在“StateServer”或“SQLServer”模式下,ASP.NET 将序列化会话状态对象,因此不允许使用无法序列化的对象或 MarshalByRef 对象。如果自定义会话状态存储在“Custom”模式下执行了类似的序列化,则适用同样的限制。<br><br>

二、session在那些时候会丢失呢?

(1)一般网站默认设置的session过期时间是20分钟,如果在20分钟内,没有和服务器交互,那么session就会丢失。

(2)当部署到IIS上后,如果IIS被重启了,那么Session也会被丢失。

(3)当修改了Web.config或global.asax,重命名文件目录,或者删除了部署项目里面的一个目录等等情况都会导致session丢失。

三、如何解决这个问题呢?

从分析session丢失的原因我们可以知道,在此项目中,由于我们删除了我们创建的一个目录,这样就会导致.net的内部机制监听到了这一现象,从而导致了重启,因此session丢失了,有人说,这算是IIS的一个BUG,但是我还是不这么认为。.NET还是提供了其他的解决方案。

要解决Session丢失的问题,我们需要先了解session到底可以存储在那?

session可以存储的位置有以下三种方式:

(1)InProc(默认的,进程内的会话状态):Sessin存储在IIS进程中,也就是在Web服务器的内存中,InProc拥有最好的性能,但进程内的Session很容易丢失Session信息,就像我们上面分析的情况,都会造成ASP.NET应用程序的重启。

(2)StateServer(进程外的会话状态):Session存储在独立的Windows服务进程aspnet_state.exe中。需要注意的是:此时必须把对象标注为可序列化的,这样才能在服务中进行存储。Microsoft建议所有的开发人员在开发过程中都是用进程外的会话状态,以避免项目如果切换到其他进程外的提供程序或SqlServer而导致站点的错误。

(3)SqlServer:Session存储在SqlServer数据库的表中,可以用aspnet_regsql.exe配置它。

在我们的系统中,我最后采用的是把Session存储到了进程外,最后把问题成功解决,具体如下:

(1)先启动ASP.NET State Services(ASP.NET状态服务),并将才服务设置为Automatic(自动启动)

(2)在Web.config文件中system.web节点添加如下代码:

<sessionState mode="StateServer" stateNetworkTimeout="20" stateConnectionString="tcpip=127.0.0.1:42424" sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" cookieless="false" timeout="60">

</sessionState>

OK了...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: