ASP.Net Core项目重启后Session登录信息丢失问题求助
解决ASP.NET Core重启后Session丢失的问题
默认ASP.NET Core的Session依赖内存分布式缓存,这种存储是进程内的,项目重启后内存数据会被清空,所以Session信息会丢失。要解决这个问题,必须配置持久化的分布式缓存,让Session数据存储到外部介质中,重启后依然能读取。
以下是几种可行的解决方案:
方案一:开发环境用文件分布式缓存(无需额外服务)
这种方式适合本地开发测试,把Session数据存在本地文件里:
- 在
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要求 });
- 确保在中间件管道中启用Session(位置很重要):
app.UseRouting(); // 必须放在UseRouting之后,UseAuthorization之前 app.UseSession(); app.UseAuthorization(); app.MapControllers();
方案二:生产环境用Redis缓存(推荐)
Redis是高性能的内存缓存数据库,适合生产环境存储Session:
- 安装NuGet包:
Microsoft.Extensions.Caching.StackExchangeRedis - 在
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环境下启用 });
- 同样要确保中间件中启用Session(位置和方案一一致)。
方案三:用SQL Server存储Session
如果你的项目已经使用SQL Server,可以直接用它来存储Session:
- 安装NuGet包:
Microsoft.Extensions.Caching.SqlServer - 运行以下命令创建Session缓存表(替换成你的数据库连接字符串):
dotnet sql-cache create "Server=(localdb)\mssqllocaldb;Database=SessionCache;Trusted_Connection=True;" dbo SessionCache
- 在
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
相关产品推荐
相关产品推荐

