sessionState与会话
HTTP 是一种无状态协议。这意味着 Web 服务器会将针对页面的每个 HTTP 请求作为独立的请求进行处理。ASP.NET 会话状态将来自限定时间范围内的同一浏览器的请求标识为一个会话,并提供用于在该会话持续期间内保留变量值的方法。默认情况下,将为所有 ASP.NET 应用程序启用 ASP.NET 会话状态。当用户在 Web 应用程序中导航 ASP.NET 页时,ASP.NET 会话状态使您能够存储和检索用户的值。
在阅读完MSDN的文档后个人对会话状态的关注点有标识符,模式还有事件。
Session标识符
Seesion在鄙人大学时学习ASP.NET WebForm的时候就接触到,当时是以Page类的内置对象来介绍。当时结合这里的理解,Session对象实际上是用于保存一个会话中所需要保留下来的值的一个字典集合。而在服务器中接受了多个用户的访问请求后,会产生多个会话,这些会话对应的Session也是以一个字典集的形式保存起来。Session内的值对应的标识符是由开发人员自己定义,而每个Session对象的标识符是由一个SessionIDManager来提供,这个SessionIDManager可以开发自己定义。服务器每次接受到一个请求时,都会检查这个请求中是否带了会话的标识符,默认是存储在cookie中的ASP.NET_SessionId,如果没有则通过SessionIDManager的CreateSessionID方法创建一个,然后响应的时候把这个SessionIDManager告诉浏览器,那么以后每次发请求的时候都会带着这个ASP.NET_SessionId的Cookie发到服务端,表明这一系列的请求都属于一个会话。
当在 Web.config 文件的 sessionState 节中将 cookieless 属性设置为 TRUE或UseUri,可以指定不将会话标识符存储在 cookie 中。ASP.NET 通过自动在页的 URL 中插入唯一的会话 ID 来保持无 cookie 会话状态。例如,下面的 URL 已被 ASP.NET 修改,以包含唯一的会话 ID lit3py55t21z5v55vlm25s55:

但凡使用了这种形式的Session配置时,在将每页发送到浏览器之前,在链接中嵌入一个会话 ID 值。只要用户遵循 ASP.NET 应用程序提供的链接路径,即可保持会话状态,否则像平时的把请求重定向或者或者跳转到某个URL时,

如上面所示因缺乏SessionId而使得服务器判定为一个新的会话,最终导致丢失了之前会话的状态。
默认情况下会回收无 cookie 会话中使用的会话 ID 值。即如果使用已过期的会话 ID 发起一个请求,将使用此请求提供的 SessionID 启动一个新的会话。将 sessionState 配置元素的 regenerateExpiredSessionId 属性设置为 true。这样,在使用已过期的会话 ID 发起无 cookie 会话请求时,将生成一个新的会话 ID。如果使用 HTTP POST 方法发起使用已过期会话 ID 的请求,则当 regenerateExpiredSessionId 为 true 时,将丢失发送的所有数据,因为 ASP.NET 会执行重定向,以确保浏览器在 URL 中具有新的会话标识符。但对于现在的Web系统而言会话过期都会导致请求时认证失败,重定向到登录页面,此时肯定会丢失所有提交的数据。
Session模式
ASP.NET 会话状态支持若干用于会话数据的存储选项。其通过web.config/sessionState中的mode属性设置,包含InProc(进程内),StateServer(状态服务器),SQLServer(SQL Server数据库模式),Custom(自定义模式),Off(禁用)
进程内模式:进程内模式是默认的会话状态模式,进程内模式将会话状态值和变量存储在本地 Web 服务器上的内存中。个人估计它是存储在工作进程(w3wp.exe)内。它是唯一支持 Session_OnEnd 事件的模式。
1.状态服务器模式:StateServer 模式将会话状态存储在一个称为 ASP.NET 状态服务的进程中,该进程是独立于 ASP.NET 辅助进程或 IIS 应用程序池的单独进程。使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。
若要使用 StateServer 模式,必须首先确保 ASP.NET 状态服务运行在用于存储会话的服务器上。ASP.NET 状态服务在安装 ASP.NET 和 .NET Framework 时作为一个服务进行安装。ASP.NET 状态服务安装在以下位置:

比如我系统的.NET Framework4的状态服务在

stateConnectionString 属性设置为 tcpip=服务器名称:42424。
2.SQL Server模式:SQLServer 模式将会话状态存储到一个 SQL Server 数据库中。使用此模式可以确保在重新启动 Web 应用程序时保留会话状态,并使会话状态可用于网络场中的多个 Web 服务器。
若要将某个 ASP.NET 应用程序配置为使用 SQLServer 模式,请在该应用程序的 Web.config 文件中执行以下操作:

在命令提示符中输入以下命令

效果如下图所示

完成后发现数据库中有一个ASPState的数据库,包含表两张和若干个存储过程

用于存储session值的表示ASPStateTempSessions,当我们访问一个页面打开一个会话的时候,就往里面写入了一条数据

个人估计字段[SessionItemShort]和[SessionItemLong]就是存储Session值
3.自定义模式:Custom 模式指定您希望使用自定义会话状态存储提供程序来存储会话状态数据。在使用 Custom 的 Mode 配置 ASP.NET 应用程序时,必须使用 sessionState 配置元素的 providers 子元素指定会话状态存储提供程序的类型。使用 add 子元素来指定提供程序类型,并包括指定提供程序类型名称的 type 属性以及指定提供程序实例名称的 name 属性。然后,将提供程序实例的名称提供给 sessionState 元素的 customProvider 属性,将 ASP.NET 会话状态配置为使用该提供程序实例来存储和检索会话数据。具体实现的话可以参考两个地方查看《会话状态存储提供程序示例 》和《如何:演示会话状态存储提供程序》
Session事件
Session事件有两个:Session_OnStart 事件和 Session_OnEnd 事件;前者在新会话开始时引发,后者在会话被放弃或过期时引发。如需使用则定义在全局文件Global.asax里面则可,但是Session_OnEnd 事件只有在会话模式是InProc,也就是使用进程内模式。
后记
最后粘贴一下整个sessionState的配置节

sessionState与会话的更多相关文章
- 你必须牢记的*.Config-配置文件
在我们第一次写web应用程序的时候,我们很快会接触到一个文件,那就是配置文件——web.config.我们的第一个比较深刻 的使用就是我们不需要把我们的数据库链接零散的写在我们的代码中了,我们只需要在 ...
- ASP.NET中Session的sessionState 4种mode模式
1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...
- WCF初探-26:WCF中的会话
理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...
- 快速入门系列--WCF--02消息、会话与服务寄宿
经过WCF基础的ABC学习,已经可以构建简单的WCF的服务,使用不同的服务地址和绑定类型,根据业务提供所需的服务契约.但不禁想问,服务所使用的消息报文是什么样的形式么?蕴含什么样内容呢?WCF服务是否 ...
- .net用SQL Server进行session会话管理
保存在内存中的session经常由于dll的变动导致丢失.有一种方法可以长期保存session,那就是session的SqlServer模式. ASP.NET允许将会话数据存储到一个数据库服务器中,方 ...
- Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom
对于asp.net 程序员来说,Session的存储方式有InProc.StateServer.SQLServer和Custom,但是Custom确很少有人提及.但Custom确实最好用,目前最实用和 ...
- SessionState详解 session有效期时间:默认20分
为当前应用程序配置会话状态设置. configuration 元素(常规设置架构) system.web 元素(ASP.NET 设置架构) sessionState 元素(ASP.NET ...
- 解决ASP.NET 自定义报表部署到IIS浏览时出现ASP.NET会话已结束问题
进到公司开始接触的项目就要做报表,原系统使用的是水晶报表,但是水晶报表展示方面美观方面不怎么好需客户需要美化一下.自定义报表与水晶报表之前都没有接触过,自己先学了一下这两种报表,后面觉得自定义报表设计 ...
- .net中SessionState相关配置
web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer. 1.off模式 从字面上就可 ...
随机推荐
- [Xamarin] 使用Webview 來做APP (转帖)
有時候,企業要求的沒有這麼多,他原本可能官方網站就已經有支援Mobile Web Design 他只需要原封不動的開發一個APP 也或是,他只是要型錄型,或是問卷調查的型的APP,這時候透過類似像if ...
- 再探.NET的PE文件结构(安全篇)
一.开篇 首先写在前面,这篇文章源于个人的研究和探索,由于.NET有自己的反射机制,可以清楚的将源码反射出来,这样你的软件就很容易被破解,当然这篇文章不会说怎么样保护你的软件不被破解,相反是借用一个软 ...
- maven package 知识(转载)
“打包“这个词听起来比较土,比较正式的说法应该是”构建项目软件包“,具体说就是将项目中的各种文件,比如源代码.编译生成的字节码.配置文件.文档,按照规范的格式生成归档,最常见的当然就是JAR包和WAR ...
- Data Profiling Task
Data Profiling Task 是用于收集数据的Metadata的Task,在使用ETL处理数据之前,应该首先检查数据质量,对数据进行分析,这将对Table Schema的设计结构和生成ETL ...
- Sql Server系列:数据类型转换函数
T-SQL提供了两个显示转换的函数:CAST函数和CONVERT函数. 1. CAST函数 语法: CAST ( expression AS data_type [ ( length ) ] ) 示例 ...
- 解密jQuery内核 DOM操作的核心函数domManip
domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...
- 轻量级前端MVVM框架avalon - 初步接触
迷你简单易用的MVVM框架 avalon的介绍http://rubylouvre.github.io/mvvm/ 按照作者的介绍,在HTML中添加绑定,在JS中用avalon.define定义View ...
- 学用MVC4做网站六:后台管理(续)
关于后台的说明: 后台将会用easyui + ajax模式. 这里涉及两个问题,一个是使用easyui如何在前台验证模型的问题,另一个是ajax提交后返回数据. 一.Easyui验证 前台验证采用ea ...
- 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)
通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...
- 可惜Java中没有yield return
项目中一个消息推送需求,推送的用户数几百万,用户清单很简单就是一个txt文件,是由hadoop计算出来的.格式大概如下: uid caller 123456 12345678901 789101 12 ...