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

摘要:
我们可以看到,第三张图中的SessionID输出与SQLServerSession状态存储服务器数据库中的SessionID一致。SessionID用于维护每个用户的数据。这是什么意思?

  前言

  我们在前篇“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的进程

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

  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>

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

  实际操作中,开始运行:

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

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

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

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

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

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

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

  <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页输出了

   运行效果

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

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

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

  

免责声明:文章转载自《ASP.NET中的状态—基于服务器端的状态管理Session(二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据持久层asp.net core 身份认证/权限管理系统简介及简单案例下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java多线程 并发编程

一、多线程 1、操作系统有两个容易混淆的概念,进程和线程。 进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。 线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中...

事务persistenceJPA基本API描述

改章节笔者在北京喝咖啡的时候突然想到的...近期就有想写几篇关于事务persistence的博客,所以回家到以后就奋笔疾书的写出来发布了 JPA(Java Persistence API,Java持久化API),定义了对象-关系映射(ORM)以及实体对象持久化的标准接口。 JPA是JSR-220(EJB3.0)标准的一部分,在JSR-220中划定实体对象(...

Session 共享(StateServer模式)(原创)

Session 共享要注意两点: 1、必须在同一个域名下 2、StateServer模式是把session保存在同一台服务器上的进程:aspnet_state.exe里面,当然也可以保存在memcache和数据库里,这个下一节再讲。 web.config设置: <machineKey decryptionKey="FD69B2EB9A11E3063...

access 数据库创建表SQL语法

create table R_CAIFA_B13 ( ID AUTOINCREMENT PRIMARY KEY, XB varchar(255), C1 varchar(50), C2 varchar(50), C3 varchar(50), C4 varchar(50), C5 varchar(50), C6 varchar(50),...

Qt数据库操作

  QtSql模块由驱动层、SQL接口层、用户接口层三部分组成,提供了与平台以及数据库种类无关的访问SQL数据库的接口。这个接口由利用Qt的模型/视图结构将数据库与用户界面集成的一套类来支持,数据库即模型的数据源。对于习惯使用SQL语法的用户,QSqlQuery类提供了直接执行任意SQL语句并处理返回结果的方法;而对于习惯使用较高层数据库接口避免使用SQL...

SQL删除重复数据的五种方式

数据量2000,其中有1000重复  -------------------------------------------------------------------------------------    --方法一,IN方式,适合2000/2005/2008,6728 毫秒  DELETE [student_L]  WHERE  id NOT...