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

.NET Core 6中HttpContext.Session.GetString始终返回Null问题

ASP.NET Core 6 Session 存列表后读取返回 null 的解决办法

1. 先确认 Startup 的 Session 配置是否正确

ConfigureServices 方法

必须添加 Session 服务,同时注入 IHttpContextAccessor 才能在业务服务中操作 Session;若序列化复杂对象,推荐配置 NewtonsoftJson 避免序列化问题:

public void ConfigureServices(IServiceCollection services)
{
    // 配置 Session 过期时间与 Cookie 属性
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
        options.Cookie.IsEssential = true;
    });

    // 注入 HttpContextAccessor,用于在服务中获取 Session
    services.AddHttpContextAccessor();

    // 配置 NewtonsoftJson 序列化(解决 System.Text.Json 的部分兼容性问题)
    services.AddControllersWithViews()
        .AddNewtonsoftJson(options =>
        {
            options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        });

    // 注册你的仓储与服务
    services.AddScoped<IUserRepository, UserRepository>();
    services.AddScoped<UserService>();
}

Configure 方法

UseSession 的调用顺序必须正确,需放在 UseRouting 之后、UseAuthorization 之前:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
        app.UseHsts();
    }

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    // 必须在此处添加 Session 中间件,顺序不能错
    app.UseSession();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

2. 列表存入/读取 Session 的正确写法

Session 的 GetString 仅能读取字符串类型数据,列表属于对象类型,必须先序列化为 JSON 字符串存入,读取时再反序列化为对象:

UserService 示例代码

public class UserService
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private readonly IUserRepository _userRepository;

    public UserService(IHttpContextAccessor httpContextAccessor, IUserRepository userRepository)
    {
        _httpContextAccessor = httpContextAccessor;
        _userRepository = userRepository;
    }

    // 将列表存入 Session
    public void SaveUserListToSession()
    {
        var userList = _userRepository.GetAllUsers();
        // 序列化为 JSON 字符串
        var userListJson = Newtonsoft.Json.JsonConvert.SerializeObject(userList);
        // 存入 Session
        _httpContextAccessor.HttpContext.Session.SetString("UserList", userListJson);
    }

    // 从 Session 读取列表
    public List<User> GetUserListFromSession()
    {
        var userListJson = _httpContextAccessor.HttpContext.Session.GetString("UserList");
        if (string.IsNullOrEmpty(userListJson))
        {
            return new List<User>();
        }
        // 反序列化为列表对象
        return Newtonsoft.Json.JsonConvert.DeserializeObject<List<User>>(userListJson);
    }
}

3. 常见错误排查点

  • Session 中间件顺序错误:UseSession 若放在 UseAuthorization 之后或 UseRouting 之前,会导致 Session 无法正常读写。
  • 未注入 IHttpContextAccessor:不在 Controller 中直接操作 Session时,必须注入该服务才能获取当前请求的 HttpContext。
  • 直接存入对象未序列化:若直接通过扩展方法 Set("UserList", userList) 存入对象,默认序列化可能失败,且 GetString 无法读取非字符串类型的数据。
  • 键名拼写不一致:存入与读取的 Session 键名必须完全匹配(区分大小写)。
  • Session 已过期:检查 IdleTimeout 配置,若读取时已超过过期时间,Session 数据会被清空。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:53:25