• 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(默认位置:systemrootMicrosoft.NETFrameworkversionNumber下面)两个脚本都创建一个名为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"   
    /> 
    这样部署完成了,如果不想使用这种可以删除掉,只要在相应的目录(systemrootMicrosoft.NETFrameworkversionNumber)找到
    UninstallPersistSqlState.sql或者UninstallSqlState.sql文件运行即可。这样就介绍了ASP.NET中的session存储模式。
    最后要注意的是,无论使用StateServer或者SQLServer模式时,当使用session转换对象时,注意对象要先序列化,就是在类前加上
    Serializable,否则会出现错误!
     
    轉載自:http://blog.csdn.net/stwuyiyu/article/details/8866110
  • 相关阅读:
    开源月刊《HelloGitHub》第 62 期
    手痒想写项目?我挑了 10 个开源项目送你
    有趣的开源项目集结完毕,HelloGitHub 月刊第 63 期发布啦!
    72 个网络应用安全实操要点,全方位保护 Web 应用的安全
    二十分钟学会Scratch图形化编程
    嵌入式linux与物联网进阶之路五:嵌入式驱动方式点亮LED
    嵌入式linux与物联网进阶之路四:嵌入式驱动开发思路
    嵌入式linux与物联网进阶之路三:根文件系统制作
    嵌入式linux与物联网进阶之路二:Linux内核编译
    嵌入式linux与物联网进阶之路一:U-Boot移植
  • 原文地址:https://www.cnblogs.com/itjeff/p/4790926.html
Copyright © 2020-2023  润新知