ASP.NET Session

无人久伴 提交于 2020-03-30 20:48:55

 

        对于ASP.NET的程序员来说, Session这个东西怎能不多加了解呢....我就自己的了解来大概介绍一下这个ASP.NET Session吧~~~~~~~

        首先, Session到底是个什么东西呢? 简单来说, Session就是服务器给客户端的一个编号. 当一台Web服务器运行是, 可能是有多个用户都在浏览这台服务器上的网站. 当每个用户首次与这台服务器建立连接时, 它就与这个服务器建立了一个Session, 同时服务器就会自动为其分配一个SessionID, 用以标识这个用户的唯一身份. 这个SessionID就是有服务器随机产生的一个由24个字符组成的字符串.
        这个唯一的SessionID还是有很大的实际意义的. 当一个用户提交表单时, 浏览器就会将用户的SessionID自动附加在HTTP头信息中, 当服务器处理完这个表单后, 就会将结果返回给SessionID所对应的用户.

大概了解了Session是个什么东西, 来看看在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 Service"这个服务的进程中. 在服务中找到名为:"ASP.NET State Service"的服务, 启动这个服务. 在资源管理器的进程中就能找到一个名为:"aspnet_state.exe"的进程, 这个就是我们保存Session的进程.
      "ASP.NET State Service"服务可以与Web服务器分开. eg: Web服务器在192.168.0.100上, "ASP.NET State Service"服务在192.168.0.101上, 则可以进行设置:
mode="StateServer" stateConnectionString="tcpip=192.168.0.101:42424".

ASP.NET服务器端Session存储到SQLServer中(SQLServer)
      当mode="SQLServer"时, 服务器的Session就是存储到SQLServer数据库中的.
      要将Session存放到SQLServer数据库中去, 首先需要在SQLServer中建立一个存储Session的数据库.
      在 %windir%\Microsoft.NET\Framework\v2.0.50727 下有个名为: InstallSqlState.sql 的sql脚本文件. 这个脚本是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的.
      执行此sql脚本后, 会看到一个新增的ASPState数据库. 但这个数据库中只有存储过程. 没有用户表. 用户表放到了tempdb这个数据库中去了: ASPStateTempSessions 和 ASPStateTempApplications. Session信息就存储到了ASPStateTempSessions中, 而ASPStateTempApplications存储了ASP中Application对象信息.
另外查看 管理-> SQL Server代理 -> 作业 , 会发现多了一个名为: ASPState_Job_DeleteExpiredSessions 的作业. 这个作业实际上是每分钟去ASPStateTempSessions中删除过期的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中了.

      OK. 到这点也差不多了..手也累了..
      上面这些也只是多ASP.NET Session一些应用的基础. 如果要涉及到更深层次的东西, 等我会了再来吧..HOHO~~~~~~~~~~~~~~

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!