ASP.NET温故而知新学习系列之ASP.NET中的状态—2-基于服务器端的状态管理Session
2012-01-14 09:04
621 查看
前言
我们在前篇“ASP.NET温故而知新学习系列之ASP.NET中的状态—1-状态管理概述”中讲到HTTP协议是个“无状态”的协议,当你从一个页面跳转到另外一个页面,它是不会保存数据的,但是我们需要数据如何从一个页面传递到另一个页面,以及在好多页面当中共享一些数据,为了允许用户通过请求保存状态信息,ASP.NET提供了Session存储机制,这些Session变量按照每个用户被存储起来,在ASP中你只能把Session变量暂时存储在Web服务器的内存里,但是这个方法已经证明了在扩展性和依赖性上的不足。
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/>节点配置状态模式
我们下面就来探讨第三种这种最好的存储模式
一:配置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状态数据库中生成的表和存储过程
二:配置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页输出了。
运行效果
每天学习一点点,每天进步一点点 用文字记录工作,用文字记录人生
我们在前篇“ASP.NET温故而知新学习系列之ASP.NET中的状态—1-状态管理概述”中讲到HTTP协议是个“无状态”的协议,当你从一个页面跳转到另外一个页面,它是不会保存数据的,但是我们需要数据如何从一个页面传递到另一个页面,以及在好多页面当中共享一些数据,为了允许用户通过请求保存状态信息,ASP.NET提供了Session存储机制,这些Session变量按照每个用户被存储起来,在ASP中你只能把Session变量暂时存储在Web服务器的内存里,但是这个方法已经证明了在扩展性和依赖性上的不足。
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/>节点配置状态模式
我们下面就来探讨第三种这种最好的存储模式
一:配置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状态数据库中生成的表和存储过程
二:配置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页输出了。
运行效果
每天学习一点点,每天进步一点点 用文字记录工作,用文字记录人生
相关文章推荐
- ASP.NET温故而知新学习系列之ASP.NET中的状态—基于服务器端的状态管理Session(二)
- ASP.NET温故而知新学习系列之ASP.NET中的状态—基于服务器端的状态管理Session(二)
- ASP.NET中的状态—基于服务器端的状态管理Session(二)
- asp.net状态管理学习二:session
- 【C#.NET】ASP.NET状态管理 APPlication,Session,Cookie和ViewStat用法
- ASP.NET学习笔记二 系统对象与状态管理
- [Asp.Net]状态管理(Session、Application、Cache)
- ASP.NET温故而知新学习系列之ASP.NET中的多线程编程—.NET下的多线程编程2.1-Thread类的使用
- 转载ASP.NET 状态管理Application,Session,Cookie和ViewState用法
- ASP.NET 2.0 状态管理 学习笔记( 二)
- asp.net页面状态管理cookie和服务器状态管理Session
- ASP.NET 状态管理(cookie、Session)
- asp.net页面状态管理cookie和服务器状态管理Session
- ASP.NET学习笔记 ---系统对象与状态管理
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程临界区(八)
- ASP.NET温故而知新学习系列之加密解密技术—对称算法加密(一)
- ASP.NET温故而知新学习系列之ASP.NET中的多线程编程—.NET下的多线程编程2.2-Thread中利用构造函数传递参数
- ASP.NET温故而知新学习系列之ASP.NET多线程编程—.NET下的多线程编程利用thread.Start()传递参数(四)
- Asp.net控件开发学习笔记(五)---Asp.net客户端状态管理
- cache:缓存在asp.net中如何管理?服务器端缓存?Session, Application, Cache objectscache ,客户端缓存?Cookies,ViewState