AddSessionStateTempDataProvider了解

AddSessionStateTempDataProvider 是 ASP.NET Core 里的一条“注册扩展”方法,作用一句话:
把 TempData 的“存储后端”从默认的“Cookie”换成“Session”,
使得 TempData 可以跨请求保存更大、更敏感的数据,而不再受 Cookie 大小/隐私限制。

  1. 背景:TempData 需要“Provider”

ASP.NET Core 的 TempData 只能在下一个请求内有效,之后自动删除。
框架把“怎么存”抽象成 ITempDataProvider,自带两种实现:
表格
复制
提供程序存储位置启用方式特点
CookieTempDataProvider (默认) 加密的 Cookie 无需配置 省内存、无服务器状态,但大小受限于 Cookie (~4 KB)
SessionStateTempDataProvider 服务器 Session 手动 AddSessionStateTempDataProvider() 可存大对象、不外泄到浏览器,但必须启用 Session 中间件

  1. 用法(两步)

  1. 先让 Session 中间件可用
csharp
复制
builder.Services.AddSession();          // 注册 Session 服务
// ...
app.UseSession();                       // 管道里启用 Session
 
  1. 把 TempData 后端换成 Session
csharp
复制
builder.Services.AddControllersWithViews()
                .AddSessionStateTempDataProvider();   // 关键一行
 
(也支持 .AddRazorPages().AddSessionStateTempDataProvider()

  1. 效果

  • 框架不再把 TempData 序列化到 Cookie,而是放到 HttpContext.Session 里,
    键名统一为 __ControllerTempData
  • 浏览器只能拿到 Session Cookie(默认 .AspNetCore.Session),看不到具体数据。
  • 可存任意可序列化对象,大小只受服务器内存限制。
  • 清除浏览器 Cookie 不会导致 TempData 丢失(除非 Session Cookie 也被删且 Session 过期)。

  1. 注意

  • 顺序不能错:UseSession() 必须放在 UseRouting() 之后、UseEndpoints() 之前。
  • 集群/容器环境要配置分布式 Session(Redis、SQL Server),否则节点间无法共享。
  • 默认 Session 闲置超时 20 min,可通过 services.Configure<CookieAuthenticationOptions>(...) 调整。

一句话总结
AddSessionStateTempDataProvider 就是:
“告诉 ASP.NET Core:别再把 TempData 存 Cookie 了,改存服务器 Session,我要放大数据或敏感内容!”
posted @ 2025-10-09 16:01  yinghualeihenmei  阅读(9)  评论(0)    收藏  举报