简介
SessionState是ASP.NET默认的机制。SessionState有几种模式。InProc,StateServer,SqlServer模式。InProc不支持负载均衡的场景。只有StateServer和SqlServer模式才支持。自定义模式是指我们自己实现Session数据的持久化,比如将Session数据放到Oracle数据库或者MySql数据库中,自定义模式也可以支持负载均衡。在StateServer和SqlServer模式时,放入Session中的数据都必须是能序列化的。建议采用SqlServer模式的Session机制。
默认模式
默认模式下Session会在客户生成一个浏览器的cookie,跟在服务端生成一个内存对象。
因为这种原理,所以当我们清理掉浏览器的cookie,再连接的时候,服务端还会生成一个新的Session对象,如果前个Session还没释放的话,就会有2个对象产生。
cookieless模式
<sessionState mode="InProc" cookieless="true" timeout="20" />
cookieless会把SessionID通过Url的方式传递回去,这个url很难看,但是不需要在本地生成cookie
将服务器Session信息存储在进程中(指aspstate进程,非iis进程)
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" cookieless="false" timeout="20" />
这种方法,优点在于支持存入到别的服务器的进程中,不过需要存入的服务器装了.NET跟开启ASP.NET State Service的服务,但是这种方式也有一个缺点,就是内存占用加大,但是这是现在最完美的方案,因为我可以用别的机器去负载均衡Session的内存消耗,因为Session内存消耗是最大是6KB,但是默认哪怕你不存储也会消耗16B的默认内存,而WIN X86单个进程最大的内存使用是2GB,也就是如果服务器是X86系统,请慎用该模式。
但是这种模式的好处是,只要存入到进程中,或者是别的机器的进程中,那么哪怕重启IIS,Session状态也不会丢失
将服务器Session信息存储在数据库中
<sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1; user id=sa; password=sa" timeout="30" />
打开Sqlserver的服务跟代理服务
执行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallSqlState.sql
会多一个aspstate的数据库
注意:当我们开启SQLServer服务的时候全局文件里的Session_Star跟Session_End函数将失灵。
这个时候再刷新现数据库中多了一条Session对象,这种方式存储比较合理,我们可以单独开一个服务器装数据库,然后作为Session专存的服务器
而且我们就算重启服务器,也不会丢失Session数据,多个网站也可以共享Session状态。
结论
以上四种方式是微软给咱们建立的四种方式,各有优缺点,不是很推荐前两种方式,因为如果负载稍微大一点,会增加很大的服务器负担,第三种方式好处可见的,速度快,但是受限制于系统进程的要求,从综合效率上来说,第三种是最快的,但是如果服务器死机则数据清零
第四种算是比较好的解决方案,我们可以开单独服务器存Session,但是如果你一台单独服务器都不存储Session的时候,我是说如果,这个需要很大的项目才会产生这种需求,那么可以考虑memcached存储Session对象,一个Session最大是6kb,memcached单个最大是1mb基本上是不用担心超出的,这样子可以提高更多的承载量,而相对于一些不太重要的数据,可以考虑cookie,这些数据如果全部存入Session,会带来不必要负担,设计犹如打太极拳,讲究是,效率,稳定,安全的均衡,没有完美的设置只有根据自己的需求的设计,才是最好的。
|