.NET Framework 4 下如何阻止定时AJAX请求重置会话空闲超时
解决方案:ASP.NET MVC (.NET Framework 4.6.1) 指定请求不重置会话空闲超时
ASP.NET Framework 默认所有携带会话Cookie的请求,只要会话状态可写,就会自动重置会话的空闲超时时间。要实现特定请求跳过该逻辑,核心是禁用指定请求的会话状态写入权限,只读权限的会话请求不会触发超时重置,且不影响Session内容读取,完全适配拉取通知这类读接口需求。
实现方案
方案1:单独Controller标记会话只读(最灵活,适配单端点)
如果通知拉取接口可独立放在单独Controller中,直接给该Controller加SessionState特性即可:
using System.Web.Mvc; using System.Web.SessionState; // 标记会话状态为只读,不会触发超时重置 [SessionState(SessionStateBehavior.ReadOnly)] public class NotificationController : Controller { // 定时AJAX调用的拉取通知接口 public ActionResult GetLatest() { // 业务逻辑:读取通知返回 return Json(new { /* 通知数据 */ }, JsonRequestBehavior.AllowGet); } }
该方案修改成本最低,若接口需要写Session,可将读、写逻辑拆分到不同Controller即可。
方案2:全局过滤指定请求(适配多端点,无需拆分Controller)
如果不想拆分原有Controller,可自定义HTTP模块,在请求管道中给指定请求标记只读会话状态:
- 自定义HTTP模块
using System; using System.Web; public class DisableSessionTimeoutResetModule : IHttpModule { public void Init(HttpApplication context) { context.PostMapRequestHandler += Context_PostMapRequestHandler; } private void Context_PostMapRequestHandler(object sender, EventArgs e) { var app = (HttpApplication)sender; var request = app.Request; // 按需求修改匹配规则,支持批量匹配多个端点 if (request.Url.AbsolutePath.Equals("/Home/GetLatestNotification", StringComparison.OrdinalIgnoreCase)) { if (app.Context.Handler is IRequiresSessionState) { // 替换为只读会话标记 app.Context.SetSessionStateBehavior(SessionStateBehavior.ReadOnly); } } } public void Dispose() { // 无额外资源需要释放可留空 } }
- 在
web.config中注册模块
<!-- IIS经典模式注册 --> <system.web> <httpModules> <add name="DisableSessionTimeoutResetModule" type="你的命名空间.DisableSessionTimeoutResetModule, 你的程序集名称"/> </httpModules> </system.web> <!-- IIS集成模式注册 --> <system.webServer> <modules runAllManagedModulesForAllRequests="true"> <add name="DisableSessionTimeoutResetModule" type="你的命名空间.DisableSessionTimeoutResetModule, 你的程序集名称" preCondition="managedHandler"/> </modules> </system.webServer>
验证方法
可在web.config中将会话超时设为1分钟快速验证:
<system.web> <sessionState timeout="1" /> </system.web>
- 登录后仅调用定时拉通知接口,1分钟后访问其他需要会话的接口,会话会正常过期
- 调用其他普通接口,会话超时会正常重置
内容的提问来源于stack exchange,提问作者Malawirel
相关产品推荐
相关产品推荐

