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

