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与会话的更多相关文章

  1. 你必须牢记的*.Config-配置文件

    在我们第一次写web应用程序的时候,我们很快会接触到一个文件,那就是配置文件——web.config.我们的第一个比较深刻 的使用就是我们不需要把我们的数据库链接零散的写在我们的代码中了,我们只需要在 ...

  2. ASP.NET中Session的sessionState 4种mode模式

    1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...

  3. WCF初探-26:WCF中的会话

    理解WCF中的会话机制 在WCF应用程序中,会话将一组消息相互关联,从而形成对话.会话”是在两个终结点之间发送的所有消息的一种相互关系.当某个服务协定指定它需要会话时,该协定会指定所有调用(即,支持调 ...

  4. 快速入门系列--WCF--02消息、会话与服务寄宿

    经过WCF基础的ABC学习,已经可以构建简单的WCF的服务,使用不同的服务地址和绑定类型,根据业务提供所需的服务契约.但不禁想问,服务所使用的消息报文是什么样的形式么?蕴含什么样内容呢?WCF服务是否 ...

  5. .net用SQL Server进行session会话管理

    保存在内存中的session经常由于dll的变动导致丢失.有一种方法可以长期保存session,那就是session的SqlServer模式. ASP.NET允许将会话数据存储到一个数据库服务器中,方 ...

  6. Asp.net 实现Session分布式储存(Redis,Mongodb,Mysql等) sessionState Custom

    对于asp.net 程序员来说,Session的存储方式有InProc.StateServer.SQLServer和Custom,但是Custom确很少有人提及.但Custom确实最好用,目前最实用和 ...

  7. SessionState详解 session有效期时间:默认20分

    为当前应用程序配置会话状态设置. configuration 元素(常规设置架构)   system.web 元素(ASP.NET 设置架构)     sessionState 元素(ASP.NET ...

  8. 解决ASP.NET 自定义报表部署到IIS浏览时出现ASP.NET会话已结束问题

    进到公司开始接触的项目就要做报表,原系统使用的是水晶报表,但是水晶报表展示方面美观方面不怎么好需客户需要美化一下.自定义报表与水晶报表之前都没有接触过,自己先学了一下这两种报表,后面觉得自定义报表设计 ...

  9. .net中SessionState相关配置

      web.config关于sessionState节点的配置方案,sessionState有四种模式:off,inProc,StateServer,SqlServer. 1.off模式 从字面上就可 ...

随机推荐

  1. 一个App完成入门篇(七)- 完成发现页面

    第七章是入门篇的倒数第二篇文章了,明天整个APP将进入收官. 本节教程主要要教会大家使用二维码扫描和用do_WebView组件加在html页面. 导入项目 do_WebView组件 扫描功能 自定义事 ...

  2. 深入浅出NodeJS——数据通信,NET模块运行机制

    互联网的运作,最根本的驱动就是信息的交互,NodeJS 在数据交互这一块做的很带感,异步编程让人很惬意,关于 NodeJS 的数据通信,最基础的两个模块是 NET 和 HTTP,前者是基于 TCP 的 ...

  3. 搭建 SVN 服务器

    安装.启动 SVN 服务器 在 Windows 下,可以使用以下命令将 SVN 服务注册到 windows 服务中去: sc create svnserver binPath= "drive ...

  4. C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字

    C#+OpenGL+FreeType显示3D文字(2) - 用GLSL+VBO绘制文字 +BIT祝威+悄悄在此留下版了个权的信息说: 上一篇得到了字形贴图及其位置字典(可导出为XML).本篇就利用此贴 ...

  5. 《Entity Framework 6 Recipes》中文翻译系列 (7) -----第二章 实体数据建模基础之拆分实体到多表以及拆分表到多实体

    2-6 拆分实体到多表 问题 你有两张或是更多的表,他们共享一样的主键,你想将他们映射到一个单独的实体. 解决方案 让我们用图2-15所示的两张表来演示这种情况. 图 2-15,两张表,Prodeuc ...

  6. Atitit sql计划任务与查询优化器--统计信息模块

    Atitit sql计划任务与查询优化器--统计信息模块 每一个统计信息的内容都包含以上三部分的内容. 我们依次来分析下,通过这三部分内容SQL Server如何了解该列数据的内容分布的. a.统计信 ...

  7. 让easyui datagrid支持bootstrap的tooltip

    让easyui datagrid支持bootstrap的tooltip 发表于 下午 1:53 by ylpro.net & 分类 Java. Easyui在1.3.3版本之前是不支持tool ...

  8. 即时搜索(input框)

    做搜索功能的时候,经常遇到输入框检查的需求,最常见的是即时搜索,今天好好小结一下. 即时搜索的方案: (1)change事件    触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标 ...

  9. Unity 文件读取

    存储: 在程序发布后文件的存放有两种,第一种是打包到Uniyt的资源包中(*.unity3D),第二种就是把文件存放在一个特殊的目录如:StreamingAssets,这个目录的东西Unity不会打包 ...

  10. 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月 ...