asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.Net Session超时的问题


发布日期:2019年06月10日
 
ASP.Net Session超时的问题
用这个方法前需要启动ASPNET State Service:开始>运行>输入 servicesmsc 回车 找到ASPNET State Service双击改成自动并启用

正常操作情况下Session会无故丢失因为程序是在不停的被操作排除Session超时的可能另外Session超时时间被设定成分钟不会这么快就超时的

这次到CSDN上搜了一下帖子发现好多人在讨论这个问题然后我又google了一下发现微软网站上也有类似的内容

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

原因

由于程序是默认配置所以WebConfig文件中关于Session的设定如下

<sessionState mode=InProc stateConnectionString=tcpip=: sqlConnectionString=data source=;Trusted_Connection=yes cookieless=true timeout=/>

我们会发现sessionState标签中有个属性mode它可以有种取值InProcStateServerSQLServer(大小写敏感) 默认情况下是InProc也就是将Session保存在进程内(IIS是aspnet_wpexe而IIS是Wwpexe)这个进程不稳定在某些事件发生时进程会重起所以造成了存储在该进程内的Session丢失

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

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

Globalasax或者nfig文件被更改

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

杀毒软件扫描了一些config文件

更多的信息请参考PRB: Session variables are lost intermittently in ASPNET applications

解决办法

前面说到的sessionState标签中mode属性可以有三个取值除了InProc之外还可以为StateServerSQLServer这两种存Session的方法都是进程外的所以当aspnet_wpexe重起的时候不会影响到Session

现在请将mode设定为StateServerStateServer是本机的一个服务可以在系统服务里看到服务名为ASPNET State Service的服务默认情况是不启动的当我们设定mode为StateServer之后请手工将该服务启动

这样我们就能利用本机的StateService来存储Session了除非电脑重启或者StateService崩掉否则Session是不会丢的(因Session超时被丢弃是正常的)

除此之外我们还可以将Session通过其他电脑的StateService来保存具体的修改是这样的同样还在sessionState标签中有个stateConnectionString=tcpip=:属性其中有个ip地址默认为本机(你可以将其改成你所知的运行了StateService服务的电脑IP这样就可以实现位于不同电脑上的程序互通Session了

如果你有更高的要求需要在服务期重启时Session也不丢失可以考虑将mode设定成SQLServer同样需要修改sqlConnectionString属性关于使用SQLServer保存Session的操作请访问这里

在使用StateServer或者SQLServer存储Session时所有需要保存到Session的对象除了基本数据类型(默认的数据类型如intstring等)外都必须序列化只需将[Serializable]标签放到要序列化的类前就可以了

[Serializable]

public class MyClass

{

……

}

具体的序列化相关的知识请参这里

至此问题解决               

上一篇:ASP.NET编程入门随想之宽容

下一篇:ASP.Net的Session