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

C# MVC中切换TempData至Session存储后数据丢失的问题咨询

解决TempData切换到Session后数据丢失的问题

以下是你需要调整的配置步骤:

1. 修正ConfigureServices中的服务注册顺序

AddSession必须在AddMvc之前注册,因为AddSessionStateTempDataProvider依赖Session服务。你的当前代码先调用AddMvc再AddSession,导致依赖注入无法正确关联Session到TempData提供器。

修改后的ConfigureServices代码:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped<System.Data.IDbConnection>((s) =>
    {
        IDbConnection conn = new SqlConnection(Configuration.GetConnectionString("accurecord"));
        conn.Open();
        return conn;
    });
    services.AddTransient<IMainPageRepository, MainPageRepository>();
    services.AddTransient<IHomeRepository, HomeRepository>();

    // 先注册Session服务
    services.AddSession(options =>
    {
        // 可选:配置Session过期时间,默认20分钟
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        // 标记Session Cookie为必要Cookie,绕过用户同意校验(适配你的CookiePolicy设置)
        options.Cookie.IsEssential = true;
    });

    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    // 再注册Mvc并指定SessionStateTempDataProvider
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
        .AddSessionStateTempDataProvider();
}

2. 修正Configure中的中间件顺序

UseSession必须在UseMvc之前执行,同时确保UseCookiePolicy在UseSession之前。另外,你需要确保UseMvc被正确添加到中间件管道中(你的当前代码片段未显示这一步,这是关键缺失项)。

修改后的Configure代码:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 其他基础中间件(如UseStaticFiles、UseDeveloperExceptionPage等)请保留在最前

    app.UseCookiePolicy();
    // 必须在UseMvc之前调用UseSession
    app.UseSession();
    // 添加Mvc路由中间件
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

3. 处理Cookie同意机制的影响

你设置了CheckConsentNeeded = true,这意味着用户未同意Cookie时,非必要Cookie会被阻止。而Session依赖的Cookie默认不属于"必要"范畴,所以需要在AddSession时设置options.Cookie.IsEssential = true,确保即使用户未同意,Session Cookie也能正常创建,保证TempData数据能存入Session。

4. 验证TempData使用逻辑

确保写入TempData后没有意外清除数据,你在读取时调用TempData.Keep()的逻辑是正确的,这能避免数据在本次请求后被自动删除。

完成以上配置后,TempData会将数据存储在服务器端Session中,不再依赖Cookie存储大量数据,同时解决数据丢失的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:55:17