AddSessionStateTempDataProvider了解
AddSessionStateTempDataProvider 是 ASP.NET Core 里的一条“注册扩展”方法,作用一句话:把 TempData 的“存储后端”从默认的“Cookie”换成“Session”,
使得 TempData 可以跨请求保存更大、更敏感的数据,而不再受 Cookie 大小/隐私限制。
-
背景:TempData 需要“Provider”
ASP.NET Core 的
框架把“怎么存”抽象成
TempData 只能在下一个请求内有效,之后自动删除。框架把“怎么存”抽象成
ITempDataProvider,自带两种实现:表格
| 提供程序 | 存储位置 | 启用方式 | 特点 |
|---|---|---|---|
CookieTempDataProvider (默认) |
加密的 Cookie | 无需配置 | 省内存、无服务器状态,但大小受限于 Cookie (~4 KB) |
SessionStateTempDataProvider |
服务器 Session | 手动 AddSessionStateTempDataProvider() |
可存大对象、不外泄到浏览器,但必须启用 Session 中间件 |
-
用法(两步)
-
先让 Session 中间件可用
csharp
builder.Services.AddSession(); // 注册 Session 服务
// ...
app.UseSession(); // 管道里启用 Session
-
把 TempData 后端换成 Session
csharp
builder.Services.AddControllersWithViews()
.AddSessionStateTempDataProvider(); // 关键一行
(也支持
.AddRazorPages().AddSessionStateTempDataProvider())-
效果
-
框架不再把 TempData 序列化到 Cookie,而是放到
HttpContext.Session里,
键名统一为__ControllerTempData。 -
浏览器只能拿到 Session Cookie(默认
.AspNetCore.Session),看不到具体数据。 -
可存任意可序列化对象,大小只受服务器内存限制。
-
清除浏览器 Cookie 不会导致 TempData 丢失(除非 Session Cookie 也被删且 Session 过期)。
-
注意
-
顺序不能错:
UseSession()必须放在UseRouting()之后、UseEndpoints()之前。 -
集群/容器环境要配置分布式 Session(Redis、SQL Server),否则节点间无法共享。
-
默认 Session 闲置超时 20 min,可通过
services.Configure<CookieAuthenticationOptions>(...)调整。
一句话总结
“告诉 ASP.NET Core:别再把 TempData 存 Cookie 了,改存服务器 Session,我要放大数据或敏感内容!”
AddSessionStateTempDataProvider 就是:“告诉 ASP.NET Core:别再把 TempData 存 Cookie 了,改存服务器 Session,我要放大数据或敏感内容!”
浙公网安备 33010602011771号