Three Session State providers :
web
InProcSessionStateStore, which stores session state in memory in the ASP.NET worker processsql
OutOfProcSessionStateStore, which stores session state in memory in an external state server process数据库
SqlSessionStateStore, which stores session state in Microsoft SQL Server and Microsoft SQL Server Express databases安全
sessionState节点的配置服务器
web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer。cookie
一、off模式网络
从字面上就能够看出这个是关闭模式,若是当前页面不须要session的值,为了减小服务器资源,你能够去掉Session的开销。session
<sessionState mode="off">或者页面上less
<%@ Page EnableSessionState="false" %>来关闭Session。
二、inProc模式(缺省模式)
它容许“无Cookie”的会话,以及在服务器以外存储
会话数据。ASP.NET会话状态模块在Web.config文件中像下面这样配置:
<sessionState mode="InProc" cookieless="false" timeout="20" />
在这个例子中,mode属性设为InProc(默认值),代表会话状态要由ASP.NET存储到内存中,并且
不用Cookie来传递会话ID。采起这种方式,无论Cookie仍是隐藏表单字段都用不着了。
因此,即便网页中没有使用表单,也能加入会话。 可是这种方法,应用程序的状态将依赖于 ASP.NET进程, 当IIS进程崩溃或者正常重启时,保存在
进程中的状态将丢失。
三、StateServer会话管理mos
将mode属性设为StateServer,也就是将会话数据存储到单独的内存缓冲区中,再由单独一台机器上运行
的Windows服务来控制这个缓冲区。状态服务全称是“ASP.NET State Service ”(aspnet_state.exe),计算机管理-服务 里面便可看到此服务,启动该服务j
它由Web.config文件中的stateConnectionString属性来配置。该属性指定了服务所在的服务器,以及要监
视的端口:
<sessionState mode="StateServer"
stateConnectionString="tcpip=myserver:42424"
cookieless="false" timeout="20" />
在这个例子中,状态服务在一台名为myserver的机器的42424端口(默认端口)运行。要在服务器上改变
端口,可编辑HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters注册表项中的Port值。
显然,使用状态服务的优势在于进程隔离,并可在Web farm(网站群)中共享。 使用这种模式,会话状态的存储将不
依赖于iis进程的失败或者重启,然而,一旦状态服务停止,全部会话数据都会丢失。换言之,状态服务不
像SQL Server那样能持久存储数据;它只是将数据存储在内存中。
4 用SQL Server进行会话管理
ASP.NET还容许将会话数据存储到一个数据库服务器中,方法是将mode属性变成SqlServer。
在这种状况下,ASP.NET尝试将会话数据存储到由sqlConnectionString属性(其中包含数据源以及登陆服
务器所需的安全凭证)指定的SQL Server中。
在VS命令行下执行命令:
aspnet_regsql.exe -ssadd -sstype c -d <Database Name> -S <SQL Server IP> -U <User Name> -P <Password>
注:在执行以上命令前,必须确保已经建立了数据库<Database Name>,<User Name>必须是sa用户或者具备sa相同权限的用户。
执行成功后,会发现多了两个表和一些存储过程:
最后修改web.config里面的sessionState节点为:
<sessionState mode="SQLServer" allowCustomSqlDatabase="true" sqlConnectionString="server=99.1.57.140; database=CMBSITE_Session; uid=cmbpost;pwd=post@cmb;" cookieless="false" timeout="20"/>
链接的数据库,根据实际状况来配置。
卸载这些表和存储过程,可使用UninstallSqlState.sql脚本,使用方法与上面相似。
配置好SQL Server后,应用程序代码运行时就和InProc模式没有什么区别。但要注意的是,因为数据不存储在本地内存,因此存储会话状态的对象须要进行序列化和反序列化,以便经过网络传给数据库服务器,以及从数据库服务器传回。这固然会影响性能。经过在数据库中存储会话状态,可分别针对扩展性及可靠性来有效地平衡性能。另外,能够利用SQL Server的集群,使状态存储不依赖于单个的SQL Server, 这样就能够为应用程序提供极大限度的可靠性。
ASP.NET 状态数据库FAQ1.若是把SESSION值存放到数据库中去,用户关闭了程序那怎么样清空数据库里的SESSION值呢?实际ASP.NET在建立状态数据库的时候会在SQL Server代理(SQL Server Agent)的做业中添加一个做业,名称为<状态数据库名>_Job_DeleteExpiredSessions。若是打开SQL Server代理服务数据库能够经过添加的状态记录的超时时间字段(Exprires)按期对超时的状态数据进行删除。2.ASPStateTempSessions表中的SessionId字段如何使用?数据库中此表的SessionID字段的值,由SessionID和AppID共同组成,最后8位为AppID因此,后8位以前必定是SessionID。例如,存储在数据库中的值为"ekr30c3mwvnc3145yrswew3a037e5e5a",后8位的"037e5e5a"为AppID,而前面的"ekr30c3mwvnc3145yrswew3a"为应用程序中你可使用Session.SessionID得到的字符串。3.如何判断Session什么时候被更新的?Session记录被更新时会同时更新Expires和LockDateLocal,Expires字段为UTC时间,若是想经过本地之间进行比较判断仍是须要使用LockDateLocal。