.NET的Session使用详解

对于asp.net的程序来说,session是一个必需要了解的对象。

下面就对session做一个具体介绍。

简单来说,Session就是服务器给客户端的一个编号,当一台web服务器运行时,可能是有多个用户都在浏览这台服务器上的网站,当每个用户首次与这台服务器建立连接时,它就与这个服务器建立了一个Session,同时服务器就会自动为其分配一个SessionId,用以标识这个用户的唯一身分,这个Session就是有服务器随机产生的一个由24个字符组成的字符串。

这个唯一的SessionId还是有很大的实际意义,当一个用户提交表单时,浏览器就会将用户的SessionId自动附加在HTTP头信息中,当服务器处理完这个表单后,就会将结果返回给SessionId所对应的用户。

如下是Web.config如何配置Session的:
<configuration>
   <system.web>
     <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 " />
   </system.web>
</configuration>

其中各个节点属性:
mode: Session的存储方式(必有的属性)。
           InProc:将Session存到进程内(这是Default值。)
           off:禁用Session.
           StateServer:将Session存到独立的状态服务中(Asp.net State Service).
           SqlServer:将Session存到SqlServer中。
Cookieless:设置客户端Session存储的方式。
                 false:使用Cookie模式(default).
                 true:使用Cookieless模式。
timeout:设置Session过期时间(default is 20 minutes)
stateConnectionString: 设置Session独立存放的状态服务所在服务器的名称(地址)和端口号,当mode=stateserver时,这个属性就是必须的。
     sqlConnectionString:设置与Sqlserver的连接字符串,当mode="sqlserver"时,这个属性时必须的。
stateNetWorkTimeout:设置当mode=StateServer时,经过多少秒空闲后,断开web服务器与存储状态信息服务器的TCP/IP连接(default is 10 seconds).

asp.net中客户端Session的存储。
      asp.net中,默认是使用Cookie存储Session的,如果是将cookieless="false",改成cookieless="true",则session就不用cookie来存储了,而是使用url来存储。

asp.net服务器端session存储在进程内(inproc)
      当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的好处就是性能提高。

      asp.net服务器端Session存储在进程外(StateServer)
     当mode="StateServer"时,服务器的Session就存储在"ASP.NET State Server"这个服务的进程中,在服务中找到名为:&ldquo;ASP.NET State Service&rdquo;的服务,启动这个服务,在资源管理器的进程中就能找到一个名为:&ldquo;aspnet_state.exe"的进程,这个就是我们保存 Session的进程。
      &rdquo;ASP.NET State Server"服务可以与Web服务器分开.eg:web服务器在192.168.0.100上,&ldquo;asp.net state service"服务在192.168.0.101上,则可以进行设置:
     mode="StateServer" stateConnection="tcpip=192.168.1.101:42424".

     asp.net服务器端Session存储到SQLServer中(SQLServer),
    当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在
%windir%\Microsoft.NET\Framework\v2.0.50727 下有个名为: 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代理 -> 作业 中也加入了相应的作业.

      然后在Web.config中设置好配置信息:

mode="SQLServer" sqlConnectionString="data source=ServerName\InstanceName; Integrated Security=SSPI;"

      "Integrated Security=SSPI;" 是指使用Windows集成身份验证.

       如果使用SQL用户登陆方式. 则在sqlConnectionString中设置好"userid=sa; password=***".

      这样一来就可以将Session存放到SQLServer中了

StateServer 模式的实质是,把Session 存放在一个单独的进程里,此进程独立于 aspnet_wp.exe 或 w3wp.exe 。启用此服务后,在“任务管理器”中可以看到一个名为 aspnet_state.exe 的进程,下面开始说明一下设置的具体步骤:

1、修改注册表(关键步骤,如下图)

运行 regedit → 打开注册表 → 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 节点 → 将 AllowRemoteConnection 的键值设置成“1”(1 为允许,0 代表禁止)→ 设置 Port (端口号)

注意事项:

a)、若ASP.NET State Service 正在运行,修改注册表内容后,则需要重新启动该服务

b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424 是默认的端口

c)、AllowRemoteConnection 的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的ASP.NET State Service,即把 Session 存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString 为“tcpip=localhost: 42424”与“tcpip=127.0.0.1:42424”的情况,方可使用ASP.NET State Service

2、 开启 ASP.NET State Service(如下图)

右键点击“我的电脑”→ 管理 → 服务与应用程序 → 服务 → 双击“ASP.NET State Service” → 启动(可设为“自动”)

说明:只要安装了 .Net Framework v1.0/v1.1 ,都拥有此服务。

3、 更改 Web.config

打开 Web.config → 找到 <sessionState> 节点内容

<sessionState

mode=”InProc”

stateConnectionString=”tcpip=127.0.0.1:42424″

sqlConnectionString=”data source=127.0.0.1;Trusted_Connection=yes”

cookieless=”false”

timeout=”20″ />

→ 将其改为以下内容

<sessionState mode=”StateServer” stateConnectionString=”tcpip=192.168.0.2:42424″ timeout=”20″ />

注意事项:

a)、设成StateServer 后,必须要有对应的stateConnectionString

b)、注意 IP 地址(可以是远程计算机 IP、计算机名称、域名)与端口号,端口号需与ASP.NET State Service 的服务端口一致

posted @ 2009-06-25 10:03  木饭  阅读(702)  评论(0编辑  收藏  举报