删除文件目录导致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了...
一、现象
在我们的系统中,用户可以创建一个目录结构到服务器上,而且可以删除自己创建的目录,测试人员发现当删除了目录后,系统的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了...
相关文章推荐
- 【转载】ASP.NET网站问题:删除或重命名站点下的任意目录导致站点重启(Session丢失)及解决办法
- Asp.Net程序目录下文件夹或文件操作导致Session失效的解决方案
- asp.net 删除目录session丢失解决方案
- asp.net删除目录,Session丢失
- asp.net 删除项目文件/文件夹IIS重启,Session丢失问题
- asp.net 修改/删除站内目录操作后Session丢失问题
- asp.net 修改/删除站内目录操作后Session丢失问题
- asp.net处理删除网站下文件夹导致iis重启session丢失的问题
- asp.net删除文件session丢失
- 基于jQuery和Flash的多文件上传插件uploadify在asp.net下session丢失解决方案
- asp.net删除文件session丢失
- 基于jQuery和Flash的多文件上传插件uploadify在asp.net下session丢失解决方案
- Asp.Net保存session的三种方法 (Dll文件更新导致session丢失的解决办法)
- ASP.NET中删除文件导致Session失效
- 关于ASP.NET 2.0的目录结构变化导致Session丢失的问题
- asp.net 修改/删除站内目录操作后会导致Session丢失
- asp.net 删除项目文件/文件夹IIS重启,Session丢失问题
- asp.net 修改/删除站内目录操作后Session丢失问题
- 对于ASP.net 2.0上传文件后session丢失问题的解决方案
- 【C#+ASP.NET】Session丢失原因与解决方案小结