在C# ASP.NET Core应用中启用会话功能,需要完成服务注册、中间件配置两个核心步骤,之后就可以在控制器或页面中读写会话数据了。
启用会话的前置准备
ASP.NET Core默认没有开启会话功能,因为会话依赖一些基础服务,首先需要确保项目已经安装了必要的NuGet包。如果是使用默认的Web应用模板创建的项目,通常已经包含了相关依赖,如果是空项目,需要手动安装Microsoft.AspNetCore.Session包。
配置会话服务
首先需要把会话服务添加到依赖注入容器中,同时可以配置会话的相关选项,比如会话的过期时间、Cookie的配置等。打开项目中的Program.cs文件,在构建应用的主方法中添加配置。
基础服务注册
在调用Build()方法之前,添加会话服务的注册代码:
var builder = WebApplication.CreateBuilder(args);
// 添加会话服务,可配置会话选项
builder.Services.AddSession(options =>
{
// 设置会话过期时间,默认是20分钟,这里设置为30分钟
options.IdleTimeout = TimeSpan.FromMinutes(30);
// 设置会话Cookie是否只能在HTTPS下传输,生产环境建议设为true
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
// 设置Cookie的名称,默认是.AspNetCore.Session
options.Cookie.Name = "MyApp.Session";
// 设置Cookie是否可以被客户端脚本访问,设为true可以防止XSS攻击
options.Cookie.HttpOnly = true;
});
// 如果需要使用分布式缓存存储会话,还需要添加对应的缓存服务,比如内存缓存
builder.Services.AddDistributedMemoryCache();
var app = builder.Build();
这里需要注意,会话默认使用IDistributedCache的实现来存储数据,所以如果没有配置分布式缓存,需要添加AddDistributedMemoryCache,否则运行时会抛出异常。如果是生产环境,建议使用Redis等分布式缓存来存储会话,避免应用重启后会话丢失。
添加会话中间件
注册完服务之后,还需要添加会话中间件,中间件需要在路由中间件之前添加,否则会话可能无法正常工作。继续在Program.cs中配置:
var app = builder.Build();
// 添加会话中间件,必须在UseRouting之前添加
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
// 启用会话中间件
app.UseSession();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
会话中间件的顺序很重要,必须放在UseRouting之前,这样才能在路由匹配之前就准备好会话状态,方便后续的处理逻辑使用。
使用会话读写数据
启用会话之后,就可以在控制器或者Razor页面中读写会话数据了。在控制器中,可以通过HttpContext.Session属性来操作会话。
写入会话数据
会话支持存储字符串、整数、字节数组等基础类型的数据,写入时需要指定键名和对应的值:
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Controllers
{
public class HomeController : Controller
{
public IActionResult SetSession()
{
// 写入字符串类型的会话数据
HttpContext.Session.SetString("UserName", "张三");
// 写入整数类型的会话数据
HttpContext.Session.SetInt32("UserId", 1001);
// 写入自定义对象的会话数据,需要先序列化为字节数组
var user = new { Name = "李四", Age = 25 };
var userBytes = System.Text.Json.JsonSerializer.SerializeToUtf8Bytes(user);
HttpContext.Session.Set("User", userBytes);
return Content("会话数据写入成功");
}
}
}
读取会话数据
读取会话数据时,使用对应的Get方法,根据键名获取值,需要注意判断值是否存在:
using Microsoft.AspNetCore.Mvc;
namespace MyApp.Controllers
{
public class HomeController : Controller
{
public IActionResult GetSession()
{
// 读取字符串类型的会话数据
var userName = HttpContext.Session.GetString("UserName");
// 读取整数类型的会话数据
var userId = HttpContext.Session.GetInt32("UserId");
// 读取自定义对象的会话数据,先获取字节数组再反序列化
var userBytes = HttpContext.Session.Get("User");
if (userBytes != null)
{
var user = System.Text.Json.JsonSerializer.Deserialize<dynamic>(userBytes);
return Content($"用户名:{userName},用户ID:{userId},其他用户:{user["Name"]}");
}
return Content($"用户名:{userName},用户ID:{userId}");
}
}
}
会话使用的注意事项
- 会话数据是存储在服务器端的,不同用户的会话数据相互隔离,不会混淆。
- 会话的过期时间是从最后一次访问开始计算的,如果用户在过期时间内没有发起请求,会话会自动失效。
- 会话Cookie默认是会话级别的,关闭浏览器后Cookie会丢失,如果需要持久化Cookie,可以配置
options.Cookie.MaxAge属性。 - 不要在会话中存储过大的数据,否则会影响性能,建议会话中只存储必要的少量临时数据。
- 如果使用多实例部署应用,必须使用分布式缓存(如Redis)存储会话,否则不同实例之间无法共享会话数据。
会话功能适合存储用户登录状态、临时操作数据等场景,不适合存储需要长期保存的重要数据,重要数据建议存储到数据库等持久化存储中。
ASP.NET_Core会话SessionC#修改时间:2026-07-16 23:00:39