ASP.NET Session 数据库存储

目录:

[TOC]

通过使用 Aspnet_regsql.exe 工具,将 ASP.NET Session 状态存储在 SQL Server 数据库中。

Session

至于为什么要将 Session 存入数据库中,那还要从 Session 存储的几个选择谈起。

  • 选择(1)Session 默认存储在 ASP.NET 进程的内存中。

    优点:应用程序对 Session 易于操作,速度更快(相对数据库而言)。

    缺点:容易丢失,并且增加内存消耗。例如,更新 dll 文件等,涉及需要重启站点时,Session 状态便会丢失,用户需要重新登录。

  • 选择(2)将 Session 存储在一个单独进程内存中。

    优点:同上。

    缺点:依然存在丢失 Session 的风险。

  • 选择(3)将 Session 存储在一台单独运行的服务器内存中。

    优点:同上。

    缺点:虽然更加稳妥了,但内存的消耗,将成为最大的顾虑。

  • 选择(4)将 Session 存储在数据库中。

    优点:对 Session 状态能够持久存储,且易于扩展(例如多站共享 Session)。

    缺点:应用程序对 Session 操作速度慢(相对内存而言),需要单独开启 SQL Server 数据库服务和代理服务。

总结:没有最优选择,只有最适合的选择。只要程序设计合理,符合应用场景,即为最优选择。

Session 数据库存储

在 Microsoft 官方文档中,对 Aspnet_regsql.exe 工具有详细介绍,在本文不再展开,传送门如下。

ASP.NET SQL Server Registration Tool (Aspnet_regsql.exe)

Aspnet_regsql.exe 安装在 Microsoft.NET Framework 目录中。如果计算机并行运行多个 .NET Framework 版本,则可能会安装该工具的多个版本。下表列出了针对 .NET Framework 不同版本的工具的安装位置。

.NET Framework 版本 Aspnet_regsql.exe 文件的位置
.NET Framework 版本 2.0 / 3.0 / 3.5 (32位系统) %windir%\Microsoft.NET\Framework\v2.0.50727
.NET Framework 版本 2.0 / 3.0 / 3.5 (64位系统) %windir%\Microsoft.NET\Framework64\v2.0.50727
.NET Framework 版本 4 (32位系统) %windir%\Microsoft.NET\Framework\v4.0.30319
.NET Framework 版本 4 (64位系统) %windir%\Microsoft.NET\Framework64\v4.0.30319

创建数据库和代理作业

使用 Aspnet_regsql.exe 工具执行下面命令:

  1. aspnet_regsql.exe -S 192.168.1.195 -U sa -P 123456 -d SessionDB -ssadd -sstype c
选项 描述
-S 已安装 SQL Server 的服务器 IP 地址或服务名称。
-U 用于登录的 SQL Server 用户 ID 。
-P 用于登录的 SQL Server 密码。
-d 指定将要创建或修改的数据库名称。如果未指定数据库,则使用默认数据库名称 aspnetdb 。
-ssadd 添加 SQL Server 对 Session 状态的支持。
-sstype 指定要使用的会话状态的类型,一共有三种选项。

-sstype 3 种会话状态的类型:

  • -sstype t 选项 t 表示,临时存储。会话状态数据存储在 SQL Server tempdb 数据库中。SQL Server ASPState 数据库中安装了用于管理会话状态的存储过程。如果重新启动 SQL ,数据将不会保留。这是默认值。
  • -sstype p 选项 p 表示,持久化存储。会话状态数据和存储过程都存储在 SQL Server ASPState 数据库中。
  • -sstype c 选项 c 表示自定义存储。会话状态数据和存储过程都存储在自定义数据库中。必须使用 -d 选项指定数据库名称。

执行过程:

  1. Microsoft Windows [版本 10.0.18363.1049]
  2. (c) 2019 Microsoft Corporation。保留所有权利。
  3. C:\WINDOWS\system32>cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
  4. C:\Windows\Microsoft.NET\Framework64\v4.0.30319>aspnet_regsql.exe -S 192.168.1.195 -U sa -P 123456 -d SessionDB -ssadd -sstype c
  5. Microsoft (R) ASP.NET SQL 注册工具版本 4.8.3752.0
  6. 用于在 SQL Server 上安装和卸载 ASP.NET 功能的管理实用工具。
  7. 版权所有(C) Microsoft Corporation。保留所有权利。
  8. 开始添加会话状态。
  9. ........
  10. 已完成。
  11. 若要在 Web 应用程序中使用此自定义会话状态数据库,请在配置文件中使用 <system.web>\<sessionState> 节中的“allowCustomSqlDatabase”和“sqlConnectionString”特性,进行相应的指定。
  12. C:\Windows\Microsoft.NET\Framework64\v4.0.30319>

ASP.NET Session 数据库存储

Web.config 设置

  1. <sessionState
  2. cookieName="mycookie"
  3. mode="SQLServer"
  4. allowCustomSqlDatabase="true"
  5. sqlConnectionString="server=127.0.0.1;uid=sa;pwd=123456;database=SessionDB;"
  6. timeout="60"
  7. cookieless="false"
  8. />

另外多说一点,如果想要做跨域共享 Session (在主站登录后,其他子站点共享登录状态),可以看看怎么修改 SessionDB 数据库中的 2 张表,一张表是用来记录站点信息,另一张记录 Session 状态的,在执行插入 Session 状态的存储过程中可修改。代理作业,用来定时执行删除过期 Session 记录的。

(完)