Asp.net的Session

ASP.NET中,状态的保持方法大致有:

  A.ApplicationState:启用 ASP.NET 应用程序中多个会话和请求之间的全局信息共享。典型应用存储全局数据

  B.SessionState:命名空间提供可将特定于某个单个客户端的数据存储在服务器上的一个 Web 应用程序中的类和接口。会话状态数据用于向客户端提供与该应用程序保持持久连接的样式。状态信息可以存储在    本地进程内存中,或者,对于网络场配置,也可以使用 ASP.NET 状态服务或Microsoft SQL Server 数据库将其存储在进程之外。典型应用入购物车项目保存

  B.Cookie:Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。 客户端浏览器会把Cookie保存起来。当浏览器再请求该    网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以 此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。典型应用如网站的个性化设置

  C.配置文件-典型应用保存客户账户信息

  D.缓存-典型应用如保存从数据库获取的数据。

Session简介:

  Session是一种Web会话中常用的状态之一,提供了一种把信息保存在服务器内存中的方式,可以存储任何数据类型,包含自定义的对象。每一个客户端的Session是独立存储的,在整个会话过程中,只要SessionID的coolie不丢失,都会保存Session信息的。Session不能跨进程访问,只能由该会话的用户访问。因为提取Session数据的ID标石是以Cookie的方式保存到访问者浏览器的缓存里的。当会话结束终止或者Session过期时,服务器就清楚Session对象.Session保存的数据是跨页面全局型的。

Session的存储方式:

  Session在web.config中的配置(各种存储方式)如下:

<sessionState mode ="Off|InProc|StateServer|SQLServer"
               cookieless ="true|false"
               timeout ="number of minutes"
               stateConnectionString ="tcpip=server:port"
               sqlConnectionString ="sql connection string"
               stateNetworkTimeout ="number of seconds" />

mode-设置session信息存储在哪里。可选值如下:

  Off:设置为不适用Session功能

  InProc:设置为将Session存储在进程内,就是ASP.NET中的存储方式,服务器将Session信息存储在IIS进程中。(默认值)

 

  StateServer:设置为将Session存储在独立的状态服务中。

  SQLServer:设置将Session存储在SQL Server中。如果存储在SQL Server交互以及数据的序列化,可能比进程内较慢一些。和SessionState相关的表主要有两个[ASPStateTempApplications]和   [ASPStateTempSessions]。其中ASPStateTempSessions的更新非常频繁。在一个繁忙的Web服务器中,下面的存储过程频繁被调用更新ASPStateTempSessions表:TempGetStateItemExclusive3、 TempResetTimeout。在Session存储到SQL Server中时,一个不常碰到的问题就是,你有可能碰到SessionState访问导致blocking(阻塞)问题。大多原因是因为TempGetStateItemExclusive3 TempResetTimeout的Update语句

UPDATE [ASPState].dbo.ASPStateTempSessions

            SET Expires = DATEADD(n, Timeout, @now),

                LockDate = CASE Locked

                    WHEN 0 THEN @now

                    ELSE LockDate

                    END,

                LockDateLocal = CASE Locked

                    WHEN 0 THEN @nowLocal

                    ELSE LockDateLocal

                    END,

             ......

                    END

            WHERE SessionId = @id
Update语句

阻塞在LCK_M_U锁上面了。解决:把transaction log放到更快的磁盘,阻塞问题应该能够缓解一点或者修改SessionStateLockedItemPollInterval的值, 使得sessionstate在block的时候,查询的频度少一点(http://support.microsoft.com/kb/939866/zh-cn)。

 

cookieless-设置客户端的session信息存储到哪里。可选值如下:

  ture:使用Cookieless模式

  false:使用Cookie模式.(默认)

 

timeout-设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟。

 

stateConnectionString-设置将Session信息存储在状态服务中时使用的服务器名称和端口号。例如:(当mode的值为StateServer时,这个参数是必须的。当服务器名称不是本地时,注册表的)。

 

sqlConnectionString-设置与SQL Server连接时的连接字符串。

 

stateNetworkTimeout-设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值时10分钟。

Session存储的实践:

  创建一个网站,添加一个Login.aspx页面和Default.aspx页面。Login.aspx页面用来保存Session,Default.aspx页面用来显示保存的Session信息。  

(1)存储在IIS进程中

  web.config的配置如下:

 <sessionState mode="InProc"                    timeout="2">

 

测试如下:

  1.创建Session访问http://localhost:12748/Login.aspx?Name=12455

  2.显示创建的Session信息http://localhost:12748/default.aspx

(2)Session存储在状态服务中

  web.config配置如下:(服务器为本地)

 <sessionState mode="StateServer"
                    stateConnectionString="tcpip=127.0.0.1:42424"
                    timeout="2">

  在windows服务中,Asp.NET状态服务-设置为启动

 

 当服务器不是本地时,设置服务器的ASP.NET状态服务为启动,设置服务器注册表的HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters的AllowRemoteConnection为1,Port(默认42424)可以修改。

(3)Session存储在SQL Server中

当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在
 %windir%/Microsoft.NET/Framework/v4.0.30319 下有个名为: InstallSqlState.sql 的sql脚本文件. 这个脚本是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的.

      执行此sql脚本后,会看到一个新增的aspstate数据库,但这个数据库中,只有存储过程,没有用户表,用户表放到了tempdb这个数据库中去 了,ASpstateTempSessions和ASPStateTempApplications,Session信息存储到了 ASPStateTempApplication存储了asp中Application对象信息。

 

    另外查看管理->SQL Server代理->作业,会发现多了一个名为:

 

ASPState_job_DeleteExpiredSession的作业,这个作业实际上是每分钟去ASPStateTempSession中删除过期的Session信息。

 

      上面的方法是建立Session数据库的一个”官方“方法,但在实际的应用中一般没这么去建,而是采用另一种方法,使用下面这段命令来自动创建Session数据库:

 

 

 

aspnet_regsql.exe -S ServerName/InstanceName -U User -P Password -d DBName -ssadd -sstype c

 

 此命令将在ServerName/InstanceName建立DBName的数据库, 用户存储Session的数据库. 此数据库中包含了存储过程和用户表.  同时在SQL Server代理 -> 作业 中也加入了相应的作业.

-S <Server> 指定正在运行 SQL Server 并且将安装或者已安装数据库的计算机的名称。

-U <login ID> 要用来登录的 SQL Server 用户 ID。此选项还要求使用密码 (-P) 选项。如果要使用 Windows 凭据 (-E) 进行身份验证,则此选项不是必需的。

-P <password> 要用来登录的 SQL Server 密码。此选项还要求使用用户 ID (-U) 选项。如果要使用 Windows 凭据 (-E) 进行身份验证,则此选项不是必需的。

-d <database> 指定要与 SQL 缓存依赖项一起使用的数据库的名称。还可以选择使用连接字符串选项 -C 指定该数据库。

-ssadd 添加对 SQL Server 模式会话状态的支持。

-sstype t|p|c

  t -- 临时。会话状态数据存储在 SQL Server 的 tempdb 数据库中。用于管理会话状态的存储过程安装在 SQL Server 的 ASPState 数据库中。如果重启 SQL,数据不会保持。这是默认设置。

  p -- 持久。会话状态数据和存储过程均存储在 SQL Server 的 ASPState 数据库中。

  c -- 自定义。会话状态数据和存储过程均存储在自定义数据库中。必须使用 -d 选项指定数据库名。

 

 

web.config的配置如下:

   <sessionState mode="SQLServer" allowCustomSqlDatabase="true"
                  sqlConnectionString="Data Source=127.0.0.1;Initial Catalog=ASPNETSession;User ID=sa;Pwd=wang302628"
                    timeout="2">

测试结果:

 

 

 

 下篇介绍“Session保存在Sql server数据库中实现跨站共享Session(实际应用:单点登录、负载均衡)”

 

 

 

    

 

posted @ 2015-07-21 15:40  聆听的风声  阅读(773)  评论(0)    收藏  举报