ASP.NET Session 的三种存储模式

摘要:我们在使用 ASP.NET 开发的过程中,有时会进行数据存储以实现请求前后的状态保持(HTTP 是无状态保持的协议),而 Session 作为一种快速简单易于实现的方式被我们经常使用,这篇文章会讲下 ASP.NET Session 的三种存储方式。

我们在使用 ASP.NET 开发的过程中,有时会进行数据存储以实现请求前后的状态保持(HTTP 是无状态保持的协议),而 Session 作为一种快速简单易于实现的方式被我们经常使用,这篇文章会讲下 ASP.NET Session 的三种存储模式。

存储模式

Session 分为服务端 Session 和客户端 Session(即 SessionID),SessionID 默认是以 Cookie 的形式来存储的,当客户端禁用了 Cookie 的话,服务端就得不到 SessionID。

这时我们可以使用 URL 的方式来传递客户端 Session,也就是将 SessionID 直接写在了 URL 中,当然这种方法不常用。

我们大多数提到的 Session 都是指服务器端 Session,它有三种存储模式 InProc、State Server、SQL Server。(自定义存储在这里不做讨论))

InProc

InProc 模式是将 Session 存储在内存中,确切地说是保存在 IIS 的工作进程中(aspnet_wp.exe 或 w3wp.exe),这也是默认的 Session 的存储方式,也是最常用的。

由于是直接保存在 IIS 进程中,所以性能最好,但是容易发生进程重启,导致 Session 丢失,常见的导致进程重启的可能情况为:

  • 配置文件中 processModel 标签的 memoryLimit 属性;
  • Global.asax 或者 Web.config 文件被更改;
  • Bin 文件夹中的 Web 程序(DLL)被修改;
  • 杀毒软件扫描了一些 .config 文件;
  • 系统资源紧张进行资源回收导致 IIS 进程崩溃或重启等。

State Server

StateServer 模式将 Session 存储在独立进程 aspnet_state.exe 而不是 IIS 进程中,这样就可以避免因 IIS 进程崩溃或重启,导致 Session 丢失。

该模式不光可以将 Session 存储在本机 aspnet_state.exe 进程中,还可以存储在其它服务器 aspnet_state.exe 进程中。

但是此种模式要求保存在 Session 的信息必须序列化,然后从 Session 中获取的时候也要反序列化,这就导致性能有略微的损失。

SQL Server

SQLServer 模式是将 Session 存储在 SQL Server 数据库中,也需要序列化,性能有较大损失,但 Session 一般不会发生丢失,因为它存储在磁盘中,除非 SQL Server 宕机。

而且此种模式可以实现在 Web Farm 中的 Session 共享。(上面两种模式都不可以)

下面是这三种模式的比较:

InProc StateServer SQLServer
存储物理位置 IIS 进程(内存) Windows 服务进程(内存) SQLServer 数据库(磁盘)
存储类型限制 无限制 可以序列化的类型 可以序列化的类型
存储大小限制 无限制
使用范围 当前请求上下文,对于每个用户独立
生命周期 第一次访问网站的时候创建 Session,超时后销毁
优点 性能比较高 Session 不依赖 Web 服务器,不容易丢失
缺点 容易丢失 序列化与反序列化消耗 CPU 资源 序列化与反序列化消耗 CPU 资源,从磁盘读取 Session 比较慢
使用原则 不要存放大量数据

分节内容

版权声明:本文为博主原创文章,未经博主允许不得转载。http://www.dedenotes.com/html/aspnet-session.html
(1)
打赏 微信扫一扫 微信 支付宝 QQ 扫码打赏

HTTP消息结构 HTTP请求报文和响应报文的格式

Dedenotes 赞(3)

HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,基于 TCP/IP 通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),所有的 WWW(World Wide Web)文件都必须遵守这个标准。

防止表单重复提交的 4 种方法

Dedenotes 赞(3)

平时开发的项目中可能会出现下面这些情况:由于用户误操作,多次点击表单提交按钮;由于网速等原因造成页面卡顿,用户重复刷新提交页面;黑客或恶意用户使用 Postman 等工具重复恶意提交表单(攻击网站)。

meta

Dedenotes 赞(3)

meta 是 html 语言 head 区的一个辅助性标签,位于文档的头部,不包含任何内容,标签的属性定义了与文档相关联的名称/值对。meta 标签可提供相关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词。