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

ASP.NET中HttpHandler读取Session值偶尔为null的问题排查

问题:ASP.NET Session 偶尔获取值为null的异常

我有一个ASP.NET页面,调用HttpHandler设置Session值后重定向至另一页面。第二个页面调用同一HttpHandler从Session中获取用户名,但偶尔会报错提示值为null,而客户端传入的用户名从不为空。

伪代码实现

public class MyHttpHandler : IHttpHandler, IRequiresSessionState
{
    public void ProcessRequest(...){...}

    public void SaveUserName(HttpContext context)
    {
         string userName = context.Request["user_name"];     
         context.Session["username"] = userName;
    }

    public void GetUserName(HttpContext context)
    {
         string userName = "";
     
         if (context.Session["username"] != null)
             userName = context.Session["username"];
         else
            throw new System.Exception("Failed to get user name from Session.");

         // returns user name to client...
    }

    // etc...
}

尝试过的无效方案

  • 尝试使用Task.Delay、Thread.Sleep等延迟方法
  • 尝试调用Session的其他属性
  • 以上方法均未解决问题,且问题仅在首次尝试时大概率出现,成功后不再复现

更新:发现竞态条件线索

发现SaveUserName被一个jQuery ajax请求调用的同时,另一个jQuery ajax请求也在尝试更新Session对象,推测是竞态条件导致问题,遂改为顺序调用ajax请求。

最终更新:问题确认与解决

确认问题根源是两个ajax调用间的竞态条件:二者竞争Session锁,仅2%的概率会出现第二个请求被阻塞,导致Session值未完成设置就被读取的情况。将其中一个ajax调用提前至工作流更早阶段,彻底规避了竞争问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 14:15:09