Session集成

Session是在服务端存储的用户会话信息,ASP.NET Core中并没有默认开启Session功能,我们需要一些额外的配置来注册分布式缓存服务、Session服务和Session中间件。这篇笔记我们介绍ASP.NET Core中Session的使用。

配置分布式缓存和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功能就生效了。

配置基于Redis的分布式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";
});
  • Configuration:Redis数据库的连接信息字符串

配置字段包括了Redis的连接信息等。实际开发中,这部分信息我们也可以配置在appsettings.json中并用配置框架加载。

存取Session数据

下面例子代码中,我们编写了一个控制器来展示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。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap