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
相关产品推荐
相关产品推荐

