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

        最近从测试人员反馈过来的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了...

 

 


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值