ASP.NET中的状态—基于服务器端的状态管理Session(二)

  前言

  我们在前篇“ASP.NET温故而知新学习系列之ASP.NET中的状态—1-状态管理概述”中讲到HTTP协议是个“无状态”的协议,当你从一个页面跳转到另外一个页面,它是不会保存数据的,但是我们需要数据如何从一个页面传递到另一个页面,以及在好多页面当中共享一些数据,为了允许用户通过请求保存状态信息,ASP.NET提供了Session存储机制,这些Session变量按照每个用户被存储起来,在ASP中你只能把Session变量暂时存储在Web服务器的内存里,但是这个方法已经证明了在扩展性和依赖性上的不足

  阅读目录

  一:ASP中Session保存在Web服务器的内存中存在的三个问题

  二:ASP.NET允许三种模式把Session变量存储在三个不同的地方

  三:在SQLServer数据库里面存储Session变量的优点

  四:我们下面就来探讨第三种这种最好的存储模式

  五:实例

  一:ASP中Session保存在Web服务器的内存中存在的三个问题

  1:这种是最容易丢失的,进程的回收、服务器进程的崩溃,都会导致你网站的访客无缘无故被退出登录。

  2:它让服务器超负荷,影响了服务器的性能

    Session变量根据每个用户生成,当它们都保存在Web服务器的内存中,想象一个千万用户的网站,由于巨大的用户数量,Web服务器存储的活跃Session变量的数目也是非常巨大的,也就意味着你的Web服务器的内存中存储了非常多的Session数据,如果不断对服务器增加负载,它有可能饱和,造成整体应用程序性能上的不良影响。

  3:它不能有效的应用Web服务器群

    Web服务器群是指一组网络服务器并行运行,服务器群里的每个Web服务器都有你网站的一个镜像,你网站的流通负载平均分配到到每个Web服务器上,从而达到负载平衡,而在Web服务器内存里存储的Session变量会阻止Web服务器群的建立。

    假设有三个Web服务器Server1,Server2,Server3,它们并行的连接在一起接受用户的请求,当有个请求Request1来到Web服务器群,根据负载平衡逻辑判断,Server2,Server3都因为有其他的任务没有空闲,但是Server1有空闲可以处理这个请求,那么请求Request1会被送到Server1进行处理,现在,想象在处理这个请求过程当中,你在Server1的内存中存储了某个Session变量,此时一切安好,过了一会,同样的用户有了另外一个请求Request2,这个请求需要上一个请求存储的Session变量,但是此时Server1被一些任务使用着,而Server2,Server3却处于空闲的状态,根据负载平衡的原则,Request2将会被送到Server2进行处理,但是Server2怎么得到上个请求的Session变量呢,毕竟Session变量存储在和Server2没有任何关联的Server1的内存中,这就意味着Request2仍然得等待Server1的空闲,这样很显然就造成了Server2,Server3的浪费也就造成了Web服务器群的浪费。

  二:ASP.NET允许三种模式把Session变量存储在三个不同的地方

  1:InProc

    网站服务器的内存中也是进程中存储

  2:StateServer

    在一台专门存放Session变量的服务器中存储,也叫Session状态信息存储服务器,它是服务器上的一个系统服务,如果您已经打开了这项系统服务,即可在任务管理器中可以查看到名为aspnet_state.exe的进程

      

  3:SQLServer

    在一个SQL Server的数据库里面存储

  三:在SQLServer数据库里面存储Session变量的优点

  1:可靠性

    因为数据是很真实的存储在一个真实的数据库里面,比其他任何方法都好,不用去担心服务器重启的问题

  2:安全性

    SQLServer模式比InProc模式和StateServer模式更安全,可以更简单的通过配置SQLServer的安全选项来保护你的数据

  3:扩展性

    Web服务器集群,可以很容易的获取Session变量,因为它们都存储在一个独立的数据库

  默认情况下是第一种模式,第二种和第三种模式叫“进程外模式”,因为Session变量的存储和Web站点没有关系。

  在web.config里可以通过<sessionState/>节点配置状态模式

  四:我们下面就来探讨第三种这种最好的存储模式

  1:配置SQL Server来存储Session状态

  配置工作需要通过一个叫aspnet_regsql.exe的命令行工具来完成

  格式

  aspnet_regsql.exe -S <SQL Server IP> -U <User Name> -P <Password> -E -ssadd -sstype c -d <Database Name>

  

  实际操作中,开始运行:

  C:\WINDOWS\Microsoft.NET\Framework\版本号\aspnet_regsql.exe -S . -U sa -P hy -ssadd -sstype c -d aspstate

 

  

  SQLServer中Session状态数据库中生成的表和存储过程

  

 

  2:配置Web.config来存储Session状态

  一旦成功配置SQLServer服务器来支持存储Session状态,下一步需要在ASP.NET Web应用程序中的Web.Config文件修改sessionState配置项以使Session状态数据库生效。

 .
 

  <sessionState mode="SQLServer" sqlConnectionString="server=.;database=aspstate;user=sa;pwd=123" allowCustomSqlDatabase="true" cookieless="false" timeout="20"></sessionState>

  五:实例

  我们创建两个Web窗体WebForm1.aspx,WebForm2.aspx ,第一个页面显示一个“添加商品至我的购物车”按钮,当单击的时候把一个固定产品保存在一个DataTable中,然后通过保存这个DataTable在一个Session变量中,来把它在请求中传递,第二个页面显示了来自DataTable中被添加的商品。

  我们可以看到第三张图输出的SessionID和SQLServerSession状态存储服务器数据库里面的SessionID一致,是通过这个SessionID来维护的每个用户的数据的,说明什么呢?说明你的Session变量被真正的存储在了SQLServer服务器的数据库中,并在WebForm2.aspx页输出了

   运行效果

  

  

  

  

 

posted @ 2012-01-12 15:28  David.Meng  阅读(2042)  评论(0编辑  收藏  举报