Session是在服务端存储的用户会话信息,ASP.NET Core中并没有默认开启Session功能,我们需要一些额外的配置来注册分布式缓存服务、Session服务和Session中间件。这篇笔记我们介绍ASP.NET Core中Session的使用。
下面例子代码中,我们配置了基于当前应用程序内存实现的Session。
Program.cs
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// 配置基于内存的缓存和Session服务
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
// 配置Session中间件
app.UseSession();
app.UseAuthorization();
app.MapControllers();
app.Run();
代码中我们主要配置了3个地方,首先我们配置了DistributedMemoryCache
缓存服务,ASP.NET Core中Session基于分布式缓存接口实现。这里不得不特殊说明一下,虽然这个服务的名字是“distributed”的,但我们这里并不是采用的分布式缓存,DistributedMemoryCache
只是一个基于内存实现的非分布式缓存,这个极具迷惑性的名称可能是“微软起名部”的又一杰作,它实际上是设计上的一种表达,这个名字表明它是为了兼容分布式缓存架构而设计的(实现了IDistributedCache
接口,API用法和分布式实现缓存一致,尽管它本身是基于内存的)。有关缓存的更多内容将在下一章节详细介绍。
其次我们配置了Session的实现方式,我们使用Cookie关联实现,我们配置了Cookie的失效时间、是否启动HttpOnly,以及这个Cookie是否是必传的。最后,我们调用app.UseSession()
启动Session中间件。此时,我们的Session功能就生效了。
前面例子我们配置的是基于内存的Session实现,它不支持分布式环境,如果要实现分布式Session,我们可以基于Redis实现。首先我们需要安装相关的NuGet依赖。
dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis --version 6.0.36
和之前的DistributedMemoryCache
不同,这里我们需要配置StackExchangeRedisCache
。
builder.Services.AddStackExchangeRedisCache(options =>
{
options.Configuration = "localhost:6379";
});
配置字段包括了Redis的连接信息等。实际开发中,这部分信息我们也可以配置在appsettings.json
中并用配置框架加载。
下面例子代码中,我们编写了一个控制器来展示Session的存取写法。
using DemoWebAPI.Model;
using Microsoft.AspNetCore.Mvc;
namespace DemoWebAPI.Controllers;
[ApiController]
[Route("api/Session")]
public class SessionController : ControllerBase
{
[HttpGet("WriteSession")]
public ActionResult<ApiResult> WriteSession()
{
HttpContext.Session.SetString("Name", "Tom");
HttpContext.Session.SetInt32("Age", 18);
return ApiResult.Success();
}
[HttpGet("ReadSession")]
public ActionResult<ApiResult> ReadSession()
{
string? name = HttpContext.Session.GetString("Name");
int? age = HttpContext.Session.GetInt32("Age");
return ApiResult.Success(new { Name = name, Age = age });
}
[HttpGet("ClearSession")]
public ActionResult<ApiResult> ClearSession()
{
HttpContext.Session.Clear();
return ApiResult.Success();
}
}
代码中,我们实现了写入Session、读取Session以及清空所有Session。此外,如果我们想删除单条Session数据,也可以调用HttpContext.Session.Remove()
方法。
当我们测试这些接口时,我们可以同时查看浏览器开发者工具的Cookie部分,如果Session中间件正常运行,我们会看到一个叫.AspNetCore.Session
的Cookie。