You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.Net Core项目重启后Session登录信息丢失问题求助

解决ASP.NET Core重启后Session丢失的问题

默认ASP.NET Core的Session依赖内存分布式缓存,这种存储是进程内的,项目重启后内存数据会被清空,所以Session信息会丢失。要解决这个问题,必须配置持久化的分布式缓存,让Session数据存储到外部介质中,重启后依然能读取。

以下是几种可行的解决方案:

方案一:开发环境用文件分布式缓存(无需额外服务)

这种方式适合本地开发测试,把Session数据存在本地文件里:

  1. 在Program.cs中添加文件缓存和Session配置:
// 配置文件分布式缓存
services.AddDistributedFileCache(options =>
{
    options.Path = Path.Combine(Directory.GetCurrentDirectory(), "SessionCache");
    // 可选:设置缓存文件的过期清理时间
    options.FileExpirationInterval = TimeSpan.FromDays(1);
});

// 配置Session参数
services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(2); // 设置Session闲置超时时间
    options.Cookie.HttpOnly = true; // 防止前端JS访问Cookie,提升安全性
    options.Cookie.IsEssential = true; // 标记为必要Cookie,符合GDPR要求
});
  1. 确保在中间件管道中启用Session(位置很重要):
app.UseRouting();

// 必须放在UseRouting之后,UseAuthorization之前
app.UseSession();

app.UseAuthorization();
app.MapControllers();

方案二:生产环境用Redis缓存(推荐)

Redis是高性能的内存缓存数据库,适合生产环境存储Session:

  1. 安装NuGet包:Microsoft.Extensions.Caching.StackExchangeRedis
  2. 在Program.cs中配置Redis缓存和Session:
services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = "localhost:6379"; // 你的Redis连接字符串,生产环境建议加上密码
    options.InstanceName = "CoreSession_"; // 缓存键前缀,避免和其他缓存冲突
});

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(2);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // HTTPS环境下启用
});
  1. 同样要确保中间件中启用Session(位置和方案一一致)。

方案三:用SQL Server存储Session

如果你的项目已经使用SQL Server,可以直接用它来存储Session:

  1. 安装NuGet包:Microsoft.Extensions.Caching.SqlServer
  2. 运行以下命令创建Session缓存表(替换成你的数据库连接字符串):
dotnet sql-cache create "Server=(localdb)\mssqllocaldb;Database=SessionCache;Trusted_Connection=True;" dbo SessionCache
  1. 在Program.cs中配置SQL Server缓存和Session:
services.AddDistributedSqlServerCache(options =>
{
    options.ConnectionString = "Server=(localdb)\mssqllocaldb;Database=SessionCache;Trusted_Connection=True;";
    options.SchemaName = "dbo";
    options.TableName = "SessionCache";
});

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromHours(2);
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

额外检查点

  • 确认你写入Session的代码没有问题,你提供的代码是正确的:
    HttpContext.Session.SetInt32("Id", parameter.Id);
    HttpContext.Session.SetInt32("CompanyId", parameter.CompanyId);
    
    读取时直接用HttpContext.Session.GetInt32("Id")即可。
  • 确保Session中间件的位置正确,这是很多人忽略的点,位置错误会导致Session无法正常工作。

内容的提问来源于stack exchange,提问作者CodeInSpace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:10:29