ASP.NET Core部署IIS后Session.Clear()无法彻底清除会话
ASP.NET Core MVC会话登出后自动恢复问题
开发环境
- 技术栈:ASP.NET Core MVC(C# + HTML Razor)
问题描述
本地Visual Studio调试时,调用HttpContext.Session.Clear()能正常清除所有会话变量;但部署到IIS后,点击登出按钮时会话变量确实会被清除,但约10-12秒后会自动恢复,用户信息重新显示,网站判定用户仍处于登录状态。偶尔会话能保持清除状态,但多数情况下都会出现该异常。
相关代码
Home控制器登出方法
[Route("logout")] [HttpGet] public IActionResult Logout() { HttpContext.Session.Clear(); return RedirectToAction("Index"); }
Razor视图中的登出链接
<a class="nav-link text-dark" asp-controller="Home" asp-action="Logout"><b>Logout</b></a>
Session扩展类(用于存储对象)
using Newtonsoft.Json; #nullable enable namespace Microsoft.AspNetCore.Http { public static class SessionExtensions { public static void SetObject(this ISession session, string key, object value) { session.SetString(key, JsonConvert.SerializeObject(value)); } public static T GetObject<T>(this ISession session, string key) { var value = session.GetString(key); return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value); } } }
补充说明:通过该扩展类将用户信息以Dictionary形式存入Session,仅在登录时从数据库获取一次,后续通过HttpContextAccessor快速获取权限,避免重复查库。
已尝试的解决方案
- 远程调试IIS部署实例:登出后会话保持清除状态约10-12秒,之后信息自动恢复
- 本地调试:登出后会话永久保持清除状态
- 清除客户端浏览器Cookie
- 重启IIS服务器及站点
- 删除IIS站点重新部署,分别尝试Debug和Release发布配置,问题无变化
- 更新所有NuGet包,升级项目至.NET 7.0框架
后续排查补充信息
- Program.cs中配置的会话空闲超时(Idle Timeout)功能正常,能按时清除会话
- 尝试手动将每个会话变量设为Null,无法彻底解决问题,仍存在会话变量设置不生效或仅临时有效的随机异常
- 移除调试页面中的Ping代码后,所有问题解决:
调试页面中的异常代码:
进一步观察发现:会话更新后变更会被保存,但10秒后会恢复原状;部分场景下会反复在新旧会话值间切换;即使未加载该调试页面,登出后会话仍会在10秒后恢复;已确认全程仅存在一个会话Cookie。目前无法解释这段Ping代码为何会引发会话异常。@{var IPAddress = HttpContextAccessor.HttpContext.Request.HttpContext.Connection.RemoteIpAddress.ToString(); Ping pingSender = new Ping(); PingReply reply1 = pingSender.Send(IPAddress); PingReply reply2 = pingSender.Send(IPAddress); PingReply reply3 = pingSender.Send(IPAddress); long[] ReplyTimes = { reply1.RoundtripTime, reply2.RoundtripTime, reply3.RoundtripTime};} @ReplyTimes
内容的提问来源于stack exchange,提问作者Taylor Gates
相关产品推荐
相关产品推荐

