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

.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模块,在请求管道中给指定请求标记只读会话状态:

  1. 自定义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()
    {
        // 无额外资源需要释放可留空
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:27:03