C#如何设置session过期时间

1、操作系统
  步骤:开始——〉管理工具——〉Internet信息服务(IIS)管理器——〉网站——〉默认网站——〉
  右键“属性”——〉主目录——〉配置——〉选项——〉启用会话状态——〉会话超时(在这儿设置你要的超时时间,单位分钟)。确定即可。
2、ASP.NET应用程序中Session过期时间的设置
  在ASP.NET这样的Web应用中,Session是用来保存用户状态的常用手段,不过由于服务器内存空间是有限的,所以Session过期时间设置是很有必要的。
  在ASP.NET中如何设置Session的过期时间呢,很简单,修改web.config配置。  
  具体修改方法如下,在web.config中进行如下配置
    <system.web>
    <sessionState mode="InProc" timeout="30"/>
    </system.web>  
  在这里指的是Session过期时间为30分钟。也就是说30分钟后如果当前用户没有操作,那么Session就会自动过期了。  
3、在调用Session的cs页中,Load事件里面写以下  Session.Timeout = 30;  
4、Store session in asp.net state service  
   <sessionState cookieless="false" timeout="480" mode="StateServer" 
   stateConnectionString="tcpip=127.0.0.1:42424" 
   sqlConnectionString="data source=127.0.0.1;user id=sa;password=" />看一下,看你的程序是用到了哪种设置方式,把时间改成你需要的时间就可以了。

ASP.Net中的Session
如果用户关闭了Cookie,Session的值一样也可以被保存。
config.web文件进行一些配制,因为在其中找到关于Session的设置文本,如:
< sessionstate cookieless="false" />
把cookieless="false" 改成cookieless="true" ,那么以后Session就不储存在cookies中了,而在储存在URL中。
Session还能在另外一台主机上保持:把localhost改成您要的主机
<sessionstate inproc="false" server="localhost" port="42424" />

***************************
先说明情况:公司做监控系统,B/S结构,主要用在局域网内部!监控系统开机可能要开好长时间,管理员的ID和权限等是写在Session里的——
我想不用Cookies的原因可能是Cookies不是很安全,还有就是局域网内,只是几台机子访问服务器,Session没有几个,所以即使总保持着Session
也不会太占用资源,最起码服务器能承受的起。   
保持Session的方法:有人说设session.timeout=-1,或小于0的数。这种方法肯定是不行的,session计算时间以分钟为单位,必须是大于等于1的整数。
又有人说设session.timeout=99999。这种同样不行,session有最大时间限制。我经过测试发现最大值为24小时,也就是说你最大可以session.timeout=1440,
1441都是不可以有,呵呵。本人测试环境:win2003+IIS6.0+ASP3.0。   
所以想通过设session.timeout的过期时间让session永不过期是不可能的。写到Cookies里是比较好的方法,网上也有很多这样的教程,这里就不再说了!
还有就是用在要保持session的页里设隐藏iframe每隔一段时间(这个时间小于session.timeout的时间)把涮新一次frame里的空页面!实现方法如下:   
在要保持session页里加上:     
< iframe   width=0   height=0   src="SessionKeeper.asp">   
< /iframe>     
同目录下建一下SessionKeeper.asp的文件。   
< html>   
< head>   
< meta   http-equiv="Refresh"   content="300;url=sessionKeeper.asp">     
< !--每隔300秒刷新一下自己,为了和服务器通讯一下,保持session不会丢-->   
< /head>   
< /html>   
这种方法还是比较长见的,另外还有一种和上面类似的方法,不过他不是用meta自动涮新嵌套的iframe的方法。
他是用javascript:window.setTimeout("functionname()",10000);第隔一段时间时间自动调用一个函数的方法,当然函数里还是要去连接一个空的文件。
具体方法如下:   
  在要保持session面里加上:     
  <script     id=Back     language=javascript></script>   
  <script   language=javascript>   
    function   keepsession(){   
      document.all["Back"].src="SessionKeeper.asp?RandStr="+Math.random();   
      //这里的RandStr=Math.random只是为了让每次back.src的值不同,防止同一地址刷新无效的情况   
      window.setTimeout("keepsession()",900);     //每隔900秒调用一下本身   
      }   
    keepsession();   
  </script>   
这样同一目录下建一个空内容的sessionKeeper.asp就文件就可以了!   
问题没有解决:通过以上的方法Session保持应该没有问题了,IIS默认无请求的清除session的值为20分钟,我设的每次交互服务的时间都远远小于这个值,
可是我大概过个一天多的时间,session还是无缘无故的没了!郁闷。   
后来在网上多方查找终于找到答案:原来IIS为了保护服务器,有一个“回收”的概念!测试了半天终于有了点大体了解(不要笑我菜^-^)。
先来看看这个“回收”在哪设置。   
启动IIS管理器->应用程序池->右键->属性->回收选项卡,有一项是默认就起作用的,就是第一项:“回收工作进程(分钟)”默认值1740分钟,大约29个小时。
他是什么意思呢?我个人理解:在session.timeout之后再过1740分钟自动把所有仍在保持的session清除。
这个值最大可设为4000000,大概是2700多天!我直接取消了,不用他自动回收!问题终于解决。   
另外这个属性对话框中还有其它几项:第二项应该是连接的用户超过了一定数目回收。第三项是到某一个时间就自动回收。
在“性能”选项卡中“在空闲此时间段后关闭工作进程”,这里就是设置IIS默认session.timeout时间的地方了。默认值20分钟,
这里同样最大值可设为4000000,和在ASP页中设置session.timeout最大值为1440不同。在这里设置超过大于1440的值是否起作用,我没作测试,
我想应该是可以的。那为什么在ASP页中session.timeout的值最大只能是1440在IIS的属性中却能设的那么大呢?
应该是属于一种保护机制:ASP页的session.timeout的值哪个用户都可以设,IIS里却只有管理员可以设,两者的权限不同,所以设置的范围就不同了。

************
在asp.net中的Session存储方式不象asp那样单一,一共提供了三种存储方式,由于最近一个2000多人使用的web软件出现了故障,用户每天早上在某一时刻出现难以登陆现象,接着Session丢值出现,只有重启IIS,或机器.这时程序恢复正常了.整天都不会出现同样的问题 ,但是第二天依旧!这种现象持续了好几天,我检查了一下日志文件,高峰每秒访问人数大概20人左右,同时大概100多人在线,以后访问人数还会增加,为了解决这个怪问题,先从软件着手,故而三种方式都应用了一番。

打开web.config文件

< sessionState   
        mode="InProc" 
        stateConnectionString="tcpip=127.0.0.1:42424" 
        sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes" 
        cookieless="false"   
        timeout="20"   
/> 
其中默认的mode是InProc类型,这种模式和以前ASP模式一样,就是服务器将Session信息存储在IIS进程当中,当IIS关闭、重起后这些进程信息都会丢失,
但这种模式的性能最高(具体没测,看书上说),这种模式是asp.net的默认方式。
由于这种模式出现了故障,当时我的考虑就是由于访问量过大的原因,导致Inetinfo.exe进程崩溃。用户难以登陆以致Session丢值出现故障,
我采用了另外一种Session的存储方式把Session信息存储在进程外。
首先,打开管理工具找到服务,找到名为:asp.net State Service的服务,启动它.并且改成自动启动。这时你可以在任务管理器中看到一个
名为aspnet_state.exe的进程。这就是我们保存session信息的进程。
然后,回到web.config文件中把Mode的值改为StateServer,保存文件。OK.
< sessionState   
        mode="StateServer" 
        stateConnectionString="tcpip=127.0.0.1:42424" 
        sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa" 
        cookieless="false"   
        timeout="20"   
/> 
这种模式当我们重起IIS,保存的session值不会丢失。另外这种方式还可以把信息保存在其他机器的进程中,不过还要更改
stateConnectionString="tcpip=127.0.0.1:42424",IP地址改为其他机器即可。
另外还采取了其他的措施.比如把数据库和Web服务器分开,数据库服务器不提供WEB服务,Web服务器不提供数据库服务,
然后把连接池扩大,由于asp.net中ADO.NET数据访问默认连接池数量为100, 后来我扩大到6000顺便把写法加上来
“Server=(local);Database=rgs;password=sa;user ID=sa;Max Pool Size =6000; Min Pool Size =5;Pooling=True”
最后把Machine.config中的ProcessModel中的memoryLimit改为95,默认为60,表示内存占用超过60%后iis进程会自动重起。接着还做写其它一些优化IIS的方法,把注册表的IIS缓存加大等等 。
当我做完这些优化步骤后,整个软件运行比较良好,第二天没有发现堵塞的现象,但是第三天情况又出现了,实在没办法,我采取了最后一种ASP.NET中的session存储方法就是将Session存储在SQLServer中,我想这样稳定性应该强些。
要使用SQLServer中,首先在会话状态的SQLServer的计算机上,运行InstallSqlState.sql或InstallPersistSqlState.sql(默认位置:systemroot\Microsoft.NET\Framework\versionNumber下面)两个脚本都创建一个名为ASPState的数据库,两个脚本的差别在于放置ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql脚本将这些表添加到TempDB数据库,该数据库在计算机重起时将丢失数据,而InstallPersistSqlState.sql脚本将这些表添加到ASPState数据库,该数据库重启时保留会话数据。
然后在应用程序的web.config文件中,把< sessionState>元素的mode属性设置为SQLServer,最后将sqlConnectionString属性设置为Integrated Security=SSPI;data source=serverName;
< sessionState mode="SQLServer" 
sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;" 
cookieless="false" 
timeout="20"/>  
< /sessionState>  
如果部署在其他机器上可以更改为,加上用户名和密码
< sessionState   
        mode="SQLServer" 
        stateConnectionString="tcpip=127.0.0.1:42424" 
        sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa" 
        cookieless="false"   
        timeout="20"   
/> 
这样部署完成了,如果不想使用这种可以删除掉,只要在相应的目录(systemroot\Microsoft.NET\Framework\versionNumber)找到
UninstallPersistSqlState.sql或者UninstallSqlState.sql文件运行即可。这样就介绍了ASP.NET中的session存储模式。
最后要注意的是,无论使用StateServer或者SQLServer模式时,当使用session转换对象时,注意对象要先序列化,就是在类前加上
Serializable,否则会出现错误!

 
上一篇:MySql避免全表扫描


下一篇:Android监听EditText输入字符串,删除指定的字符