ASP.NET Core 3.1 Web API配置Session后抛出NullReferenceException如何解决?
排查修复方案
- 首先修正中间件注册顺序
你当前的UseSession放在了中间件管道的最开头,不符合ASP.NET Core 3.1的中间件执行顺序要求,UseSession必须放在UseRouting之后、UseAuthorization之前,否则Session对象还未完成初始化就被调用,就会触发空引用异常。修正后的Configure方法代码如下:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); // 此处放置UseSession app.UseSession(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
- 检查Session调用的上下文环境
从报错堆栈看,你是在自定义的MainRoute.Handler方法中调用的Session,如果该方法脱离了控制器请求的同步执行上下文(比如异步子线程、上下文已释放的场景),会导致HttpContext为空。如果需要在非控制器类中访问Session,可按如下步骤配置:
- 在
ConfigureServices中注册HttpContext访问器:
services.AddHttpContextAccessor(); services.AddDistributedMemoryCache(); services.AddSession();
- 在自定义类中通过构造注入
IHttpContextAccessor,再访问Session:
private readonly IHttpContextAccessor _httpContextAccessor; public MainRoute(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } // 调用时判空 public void Handler(ILogger<MainRoute> logger) { var session = _httpContextAccessor.HttpContext?.Session; if (session != null) { session.SetString("currentUser", "value1"); } }
- 前后端分离场景补充配置
如果你的Web API对接独立前端项目,需要额外配置CORS允许凭据传递,前端发请求时开启携带Cookie配置,否则Session不会在多次请求间生效:服务端CORS配置需添加AllowCredentials(),前端Axios请求设置withCredentials: true,Fetch请求设置credentials: 'include'。
内容的提问来源于stack exchange,提问作者Simon Rex
相关产品推荐
相关产品推荐

