_httpContextAccessor?.HttpContext?.Session?.Id
这行代码就是把“能空就空”的防御式写法一路用到头,最终想拿的只是当前用户 Session 的 Id(字符串),如果中间任何一环拿不到,结果就是 null
,不会抛异常。
“只要有一个环节拿不到就整体返回 null,否则给我当前 Session 的 Id。”
常见坑
1、没注册 IHttpContextAccessor .AddHttpContextAccessor() 忘写,整个 _httpContextAccessor 就是 null。
2、Session 中间件没开或顺序不对
app.UseSession(); // 必须存在 app.UseRouting(); // 顺序别反
3、首次请求 Session 还没建立
只要服务器端没有往 Session 写任何数据,浏览器 Cookie 里就没有 .AspNetCore.Session,此时 Session.Id 虽然后台已生成,但下一次请求才会种 Cookie,所以当前请求读到的仍是 null。 解决:先随便写一点东西进去
HttpContext.Session.SetString("flag", "1");
Web API / 最小 API 默认不开 Cookie 前后端分离项目经常把 Session 关掉,或者浏览器根本不会带 Cookie,这时 Session.Id 永远是 null,不如直接用 JWT 做无状态认证。