ASP.NET 6中分布式SQL Server缓存会话状态配置异常问题
问题排查与解决方案
1. 检查中间件顺序
ASP.NET 6中app.UseSession()的位置必须严格遵循以下顺序:
- 位于
app.UseRouting()之后 - 位于
app.UseAuthorization()和app.MapControllers()之前
错误的中间件顺序会直接导致Session无法初始化,以下是正确的配置示例:
var builder = WebApplication.CreateBuilder(args); // 注册分布式缓存与Session服务 builder.Services.AddDistributedSqlServerCache(options => { options.ConnectionString = builder.Configuration.GetConnectionString("DistCache_ConnectionString"); options.SchemaName = "dbo"; options.TableName = "TestCache"; }); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(10); options.Cookie.IsEssential = true; }); builder.Services.AddControllers(); var app = builder.Build(); // 中间件配置 app.UseHttpsRedirection(); app.UseRouting(); app.UseSession(); // 此位置不可调换 app.UseAuthorization(); app.MapControllers(); app.Run();
2. 显式触发Session加载
Session默认采用懒加载机制,部分场景下调用SetString可能无法及时触发Session初始化,建议显式加载:
await HttpContext.Session.LoadAsync(); HttpContext.Session.SetString("name", "test"); var id = HttpContext.Session.Id; var a = HttpContext.Session.GetString("name");
3. 验证缓存表结构
手动创建的表可能存在结构偏差,推荐使用官方命令生成标准表结构:
dotnet sql-cache create "你的数据库连接字符串" dbo TestCache
该命令会自动生成包含正确列、索引的缓存表,确保分布式缓存能正常写入数据。
4. 确认连接字符串有效性
检查appsettings.json中DistCache_ConnectionString的配置是否正确,同时确保应用程序拥有SQL Server实例的访问权限:
{ "ConnectionStrings": { "DistCache_ConnectionString": "Server=你的服务器地址;Database=目标数据库;Trusted_Connection=True;TrustServerCertificate=True;" } }
.NET 6相关变更说明
ASP.NET 6的Session与分布式缓存核心逻辑和.NET Core 3.x/2.x无本质差异,主要变化是Program.cs采用顶级语句简化了配置流程,核心注意点仍为中间件顺序和服务注册顺序,没有新增强制配置项。
内容的提问来源于stack exchange,提问作者ld dl
相关产品推荐
相关产品推荐

