zoukankan      html  css  js  c++  java
  • 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页输出了

       运行效果

      

      

      

      

  • 相关阅读:
    N的阶乘:高精度
    蓝桥杯历届试题 连号区间数:枚举(含样例解释)
    最大公共子串:DP
    IncDec序列:差分+贪心
    [ACM] hdu 1465 不容易系列之一(错排复习)
    写给现在,写给未来
    [ACM] hdu 2082 找单词 (母函数)
    [ACM] poj 1146 ID Codes(字符串的下一个排列)
    [ACM] hdu 2149 Public Sale (巴什博奕)
    [ACM] hdu 1846 Brave Game (巴什博奕)
  • 原文地址:https://www.cnblogs.com/menglin2010/p/2320593.html
Copyright © 2011-2022 走看看