如何在ASP.NET MVC及ASP.NET Core中管理Session?ASP.NET Core MVC实现咨询
ASP.NET MVC 与 ASP.NET Core Session 管理实现方案
1. ASP.NET MVC(.NET Framework 版本)Session 管理
该版本的Session默认已启用,无需额外配置,直接在控制器中通过Session对象操作即可:
- 存储值:
Session["CustomKey"] = "存储内容"; - 读取值:
var value = Session["CustomKey"]?.ToString(); - 删除指定键:
Session.Remove("CustomKey"); - 清空所有Session:
Session.Clear(); - 配置过期时间:在Web.config的
<system.web>节点下添加配置,单位为分钟:<sessionState timeout="30" />
2. ASP.NET Core MVC Session 实现
ASP.NET Core默认未启用Session,需要手动完成配置后使用,步骤如下:
步骤1:引入依赖
- .NET 6及以上版本:框架已内置Session组件,无需额外安装NuGet包
- .NET 5及更早版本:需要安装NuGet包
Microsoft.AspNetCore.Session
步骤2:注册服务与配置中间件
注意:中间件顺序不能乱,UseSession必须放在路由中间件之后、授权中间件和端点映射之前,否则Session不会生效
.NET 6+ 版本(Program.cs)配置示例:
var builder = WebApplication.CreateBuilder(args); // 注册Session服务 builder.Services.AddSession(opt => { // 设置Session空闲过期时间,这里设为30分钟 opt.IdleTimeout = TimeSpan.FromMinutes(30); // Session对应的Cookie设置,HttpOnly防止前端JS读取,避免XSS风险 opt.Cookie.HttpOnly = true; opt.Cookie.IsEssential = true; }); // 注册MVC服务 builder.Services.AddControllersWithViews(); var app = builder.Build(); // 按顺序添加中间件 app.UseRouting(); // 必须放在路由之后,授权之前 app.UseSession(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.Run();
.NET 5及更早版本(Startup.cs)配置示例:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddSession(opt => { opt.IdleTimeout = TimeSpan.FromMinutes(30); opt.Cookie.HttpOnly = true; opt.Cookie.IsEssential = true; }); services.AddControllersWithViews(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseRouting(); app.UseSession(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } }
步骤3:控制器中操作Session
ASP.NET Core Session原生仅支持存储int、string、byte[]三类数据,存储复杂对象需要先序列化为JSON字符串。
基础操作示例:
// 存储字符串 HttpContext.Session.SetString("UserName", "张三"); // 存储整型 HttpContext.Session.SetInt32("UserId", 10001); // 读取数据 var userName = HttpContext.Session.GetString("UserName"); var userId = HttpContext.Session.GetInt32("UserId"); // 删除指定键 HttpContext.Session.Remove("UserName"); // 清空所有Session HttpContext.Session.Clear();
存储复杂对象示例:
// 存对象 var userInfo = new User { Id = 1, Name = "张三", Phone = "13xxxxxxxxx" }; HttpContext.Session.SetString("UserInfo", JsonSerializer.Serialize(userInfo)); // 取对象 var userJson = HttpContext.Session.GetString("UserInfo"); if (!string.IsNullOrEmpty(userJson)) { var userInfo = JsonSerializer.Deserialize<User>(userJson); }
步骤4:视图中读取Session
在Razor视图中可以直接通过Context访问Session:
@{ var userName = Context.Session.GetString("UserName"); } <p>当前登录用户:@userName</p>
注意事项
- 默认Session存储在服务端内存中,分布式部署场景下需要配置分布式Session,将数据存储到Redis、SQL Server等公共存储介质中,避免多实例之间Session不同步
- 不要在Session中存储过大体积的数据,避免占用过多服务端内存影响性能
内容的提问来源于stack exchange,提问作者Jaynil Choksi
相关产品推荐
相关产品推荐

