浅谈Asp.net的sessionState

浅谈Asp.net的sessionState html


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中。

  1. 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相同权限的用户。

 

执行成功后,会发现多了两个表和一些存储过程:

 


  1. 最后修改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。

相关文章
相关标签/搜索