关于Asp.Net的SessionState

本文分享了一次针对SQL Server中AspState会话状态库的优化经历,通过对tempdb..ASPStateTempSessions表进行索引重建,成功解决了数据库服务器CPU高负荷的问题,并介绍了ASP.NET会话状态的不同存储模式及其配置。

前因:近日在一项目中数据库服务器CPU频繁发生负荷几乎达到100%崩溃状态,检查发现很多对AspState会话状态库进程阻塞情况,通过排查发现tempdb..ASPStateTempSessions的扫描碎片比率很大,故怀疑此引发问题的,为保守起见,没有重新执行脚本InstallSqlState.sql,而是执行dbcc dbreindex对tempdb..ASPStateTempSessions表进行索引重建,经过在线高峰监测,数据库服务器CPU负荷大幅下降,运作正常,问题解决!

虽然问题解决了,但还是留下很多需要是深入了解探究的知识。

重建索引前

表: 'ASPStateTempSessions'1977058079);索引 ID: 1,数据库 ID: 2
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 3025
- 扫描扩展盘区数...............................: 384
- 扩展盘区开关数...............................: 2970
- 每个扩展盘区上的平均页数.....................: 7.9
- 扫描密度[最佳值:实际值]....................: 12.76%379:2971
- 逻辑扫描碎片.................................: 50.38%
- 扩展盘区扫描碎片.............................: 95.31%
- 每页上的平均可用字节数.......................: 4035.8
- 平均页密度(完整)...........................: 50.14%

重建索引后

表: 'ASPStateTempSessions'1977058079);索引 ID: 1,数据库 ID: 2
已执行 TABLE 级别的扫描。
- 扫描页数.....................................: 1744
- 扫描扩展盘区数...............................: 220
- 扩展盘区开关数...............................: 219
- 每个扩展盘区上的平均页数.....................: 7.9
- 扫描密度[最佳值:实际值]....................: 99.09%218:220
- 逻辑扫描碎片.................................: 0.00%
- 扩展盘区扫描碎片.............................: 6.36%
- 每页上的平均可用字节数.......................: 1050.9
- 平均页密度(完整)...........................: 87.02%

扫描密度大幅提高,碎片下降!


下面简单整理一下关于会话状态的相关知识。

参考微软MSDN文章:http://msdn.microsoft.com/en-us/library/ms178586(v=VS.85).aspx

  • 会话状态的存储模式

1、In-process Mode 默认进程模式

<sessionState mode="Inproc" cookieless="false" timeout="20"/> </sessionState>

2、State Server Mode

<sessionState mode="StateServer" stateConnectionString="tcpip=dataserver:42424" cookieless="false" timeout="20"/> </sessionState> 

3、SQL Server Mode

<sessionState mode="SQLServer" sqlConnectionString=" Integrated Security=SSPI;data source=dataserver;" cookieless="false" timeout="20"/> </sessionState> 

语法:

<sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" timeout="number of minutes" stateConnectionString="tcpip=server:port" sqlConnectionString="sql connection string" stateNetworkTimeout="number of seconds" /> 

mode 设置将Session信息存储到哪里?

Off 设置为不使用Session功能

InProc 设置为将Session存储在进程内,就是ASP中的存储方式,这是默认值。

StateServer 设置为将Session存储在独立的状态服务中。 <驱动器>:\systemroot\Microsoft.NET\Framework\version\aspnet_state.exe

SQLServer 设置将Session存储在SQL Server中。 <驱动器>:\systemroot\Microsoft.NET\Framework\version\InstallSqlState.sql

可选的属性是:

属性 选项 描述

cookieless 设置客户端的Session信息存储到哪里 ture 使用Cookieless模式 false 使用Cookie模式,这是默认值。

timeout 设置经过多少分钟后服务器自动放弃Session信息。默认为20分钟

stateConnectionString 设置将Session信息存储在状态服务中时使用的服务器名称和端口号,例如:"tcpip=127.0.0.1:42424”。当mode的值是StateServer是,这个属性是必需的。

sqlConnectionString 设置与SQL Server连接时的连接字符串。

例如"data source=localhost;Integrated Security=SSPI;Initial Catalog=northwind"。当mode的值是SQLServer时,这个属性是必需的。

stateNetworkTimeout 设置当使用StateServer模式存储Session状态时,经过多少秒空闲后,断开Web服务器与存储状态信息的服务器的TCP/IP连接的。默认值是10秒钟。

  • Installing the Session State Database Using the Aspnet_regsql.exe Tool

systemroot\Microsoft.NET\Framework\versionNumber\InstallSqlState.sql

如:aspnet_regsql.exe -S 数据库实例名 -E -ssadd -sstype p

 

  • ASP.NET 状态数据库FAQ
    1.如果把SESSION值存放到数据库中去,用户关闭了程序那怎么样清空数据库里的SESSION值呢?
    实际ASP.NET在创建状态数据库的时候会在SQL Server代理(SQL Server Agent)的作业中添加一个作业,名称为<状态数据库名>_Job_DeleteExpiredSessions。如果打开SQL Server代理服务数据库可以通过添加的状态记录的超时时间字段(Exprires)定期对超时的状态数据进行删除。
    2.ASPStateTempSessions表中的SessionId字段如何使用?
    数据库中此表的SessionID字段的值,由SessionID和AppID共同组成,最后8位为AppID所以,后8位之前一定是SessionID。例如,存储在数据库中的值为"ekr30c3mwvnc3145yrswew3a037e5e5a",后8位的"037e5e5a"为AppID,而前面的"ekr30c3mwvnc3145yrswew3a"为应用程序中你可以使用Session.SessionID获得的字符串。
    3.如何判断Session何时被更新的?
    Session记录被更新时会同时更新Expires和LockDateLocal,Expires字段为UTC时间,如果想通过本地之间进行比较判断还是需要使用LockDateLocal。
    4.获得Web.config配置文件节点信息的程序?

安装

打开VS命令提示,输入:aspnet_regsql.exe –?  

aspnet_regsql.exe的说明,有一命令:-ssadd(Session state add?) 意为:添加对 sqlserver 模式会话状态的支持.

输入如下:

aspnet_regsql.exe -ssadd –E 或 指定用户名:aspnet_regsql.exe -ssadd -U sa

删除该功能则执行aspnet_regsql.exe -ssremove –E

 

 

参考资料:

http://www.cnblogs.com/leonsky/articles/1427014.html

http://msdn.microsoft.com/en-us/library/ms178586(v=VS.85).aspx

http://space.itpub.net/16436858/viewspace-551828

将Session值储存于SQL Server中.

转载于:https://www.cnblogs.com/shijun/archive/2011/08/04/2128045.html

<think>好的,我现在要帮助用户解决关于C# .NETsessionState的配置与使用问题。首先,我需要仔细理解用户的需求。用户提到了几个引用资料,涉及ASP.NET.NET C#以及.NET Core中的Session配置,包括Web.config设置、代码中的调整以及不同模式的区别。用户可能想了解如何正确配置sessionState,选择不同的模式,设置超时时间,以及在不同版本的.NET中的实现差异。 首先,我应该先整理sessionState的基本概念,不同的模式(InProc、StateServer、SQLServer、Off),以及各自的优缺点。然后,需要说明如何在Web.config中配置这些模式,包括各个参数的意义,比如timeout、cookieless、stateConnectionString等。接下来,用户可能想知道如何在代码中动态设置Session的超时时间,比如使用Session.Timeout属性。此外,用户提供的引用中提到了.NET Core中的Session配置,这部分需要单独说明,因为.NET Core的配置方式与传统ASP.NET有所不同,比如在Startup.cs中注入服务和中间件。 还要注意用户可能遇到的一些常见问题,比如Session丢失的情况,特别是在使用InProc模式时,应用程序池回收会导致Session丢失,这时候可能需要使用StateServer或SQLServer模式来持久化Session。同时,超时时间的设置涉及到服务器配置和代码配置,需要解释两者的优先级和最佳实践。 另外,引用资料中提到了不同的配置方法,比如在Web.config中添加sessionState节点,或者在代码中设置Session.Timeout,或者在IIS中进行设置。需要比较这些方法的适用场景和注意事项。例如,使用StateServer模式时需要确保ASP.NET状态服务已经启动,SQLServer模式则需要创建相应的数据库表结构。 在.NET Core部分,用户需要了解如何通过AddSession和AddDistributedSqlServerCache来配置分布式缓存,以及设置IdleTimeout。这部分与传统ASP.NET的配置方式不同,需要详细说明步骤,包括在ConfigureServices中注册服务,在Configure中启用中间件。 最后,用户可能希望了解如何选择适合自己项目的Session模式,比如小型应用可能适合InProc,而需要持久化或扩展的应用则选择StateServer或SQLServer。同时,安全性方面,使用SQLServer模式时需要注意连接字符串的保护,避免敏感信息泄露。 总结一下,我需要分步骤解释sessionState的配置方法,涵盖不同模式和.NET版本,提供代码示例,比较不同模式的优缺点,并给出常见问题的解决方案。同时,根据用户提供的引用资料,确保信息的准确性和相关性,正确标注引用来源。</think>### C# .NET SessionState 配置与使用详解 #### 一、SessionState 基础配置 1. **Web.config 配置** 在 ASP.NET 中,SessionState 的配置主要通过 `Web.config` 文件的 `<sessionState>` 节点实现。支持以下模式: - **InProc**(默认):Session 存储在内存中,重启应用或进程回收会丢失数据。 ```xml <sessionState mode="InProc" timeout="20" cookieless="false" /> ``` - **StateServer**:Session 存储在独立进程(ASP.NET 状态服务)中,需启动服务。 ```xml <sessionState mode="StateServer" timeout="30" stateConnectionString="tcpip=127.0.0.1:42424" /> ``` - **SQLServer**:Session 持久化到 SQL Server 数据库,需初始化表结构。 ```xml <sessionState mode="SQLServer" sqlConnectionString="Data Source=server;Initial Catalog=SessionDB;..." /> ``` - **Off**:禁用 Session[^4]。 - **参数说明**: - `timeout`:会话超时时间(分钟)。 - `cookieless`:是否启用无 Cookie 模式(URL 嵌入 Session ID)。 - `stateConnectionString`:StateServer 的地址和端口[^2][^5]。 2. **代码中动态设置超时** 在 C# 中可通过 `Session.Timeout` 属性调整超时时间: ```csharp protected void Page_Load(object sender, EventArgs e) { Session.Timeout = 60; // 单位:分钟 } ``` #### 二、.NET Core 中的 Session 配置 .NET Core 的 Session 配置方式与传统 ASP.NET 不同,需依赖中间件和分布式缓存: 1. **Startup.cs 配置** - 注册服务: ```csharp public void ConfigureServices(IServiceCollection services) { services.AddDistributedSqlServerCache(o => { o.ConnectionString = "server=10.1.1.10;database=SessionDB;..."; o.SchemaName = "dbo"; o.TableName = "SessionState"; }); services.AddSession(o => { o.IdleTimeout = TimeSpan.FromMinutes(30); // 超时时间 }); } ``` - 启用中间件: ```csharp public void Configure(IApplicationBuilder app) { app.UseSession(); } ``` - 使用 SQL Server 分布式缓存需预先执行脚本创建表结构[^3]。 #### 三、模式对比与选型建议 | 模式 | 优点 | 缺点 | 适用场景 | |------------|-------------------------------|-------------------------------|-----------------------| | **InProc** | 简单、性能高 | 数据易丢失,不支持扩展 | 单服务器小型应用 | | **StateServer** | 支持多服务器共享 | 需维护状态服务 | 负载均衡环境 | | **SQLServer** | 数据持久化,高可靠 | 性能较低,需数据库支持 | 关键业务或高可用需求 | | **Off** | 节省资源 | 无法使用 Session | 无需 Session 的场景 | #### 四、常见问题与解决 1. **Session 丢失** - InProc 模式下,应用程序池回收会导致数据丢失。解决方法:改用 StateServer 或 SQLServer 模式[^1]。 - 检查 `timeout` 是否过短,或代码中是否主动调用 `Session.Abandon()`。 2. **分布式环境配置** - 使用 StateServer 时,需确保 `ASP.NET State Service` 已启动(通过 `services.msc` 检查)。 - SQLServer 模式需执行 `InstallSqlState.sql` 脚本初始化数据库。 3. **性能优化** - 避免存储大型对象,优先使用轻量数据(如用户 ID)。 - 对频繁访问的 Session 数据增加缓存机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值