小型内部.NET Core 3.1 AJAX Web应用跨请求维护状态的方法
最理想的状态保留方案:Session状态
针对你这个内部工具的场景,Session状态是最适合的选择,理由如下:
- 适配使用场景:少数用户、无身份验证需求,ASP.NET Core的Session默认用匿名Cookie维持,不需要用户登录,只要浏览器支持Cookie就能用,服务器端开销极低
- 轻松处理复杂状态:能直接存储包含int、string、List/Dictionary的对象,只要对象可序列化即可,不用自己折腾客户端的序列化逻辑
- 贴合连续AJAX调用流程:Session绑定用户会话,从OnGet加载页面到连续5次AJAX调用的整个流程中,状态都会在服务器端稳定保留,不用每次请求都把状态来回传递,省心高效
其他可选方案的不足
- 客户端存储(LocalStorage/SessionStorage):虽然能存状态,但需要手动序列化/反序列化对象,且状态放在客户端,哪怕无安全问题,也不如服务器端维护稳妥;另外每次AJAX请求无需携带状态数据,能减少请求体积
- TempData:TempData默认仅保留到下一次请求,要连续使用5次得每次手动调用
Keep()或Peek(),操作繁琐,远不如Session一存到底方便 - 隐藏字段/请求传参:每次AJAX都要把状态序列化后传递,服务器处理完再返回更新后的状态,对象复杂时序列化容易出问题,还会增加请求开销
Session的简单实现步骤
- 配置Session:在Program.cs里添加Session服务,设置过期时间(比如10分钟足够覆盖连续调用流程):
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(10); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 启用Session中间件 app.UseSession();
- 在PageModel里注入
ISession,通过序列化方式存取状态对象:
private readonly ISession _session; public YourPageModel(ISession session) { _session = session; } // 存储状态 var yourState = new YourStateObject { Count = 1, Name = "test", Items = new List<string>() }; var json = JsonSerializer.Serialize(yourState); _session.SetString("YourStateKey", json); // 获取并更新状态 var json = _session.GetString("YourStateKey"); if (!string.IsNullOrEmpty(json)) { var yourState = JsonSerializer.Deserialize<YourStateObject>(json); // 执行状态更新逻辑 yourState.Count++; // 将更新后的状态存回Session _session.SetString("YourStateKey", JsonSerializer.Serialize(yourState)); }
内容的提问来源于stack exchange,提问作者cdub
相关产品推荐
相关产品推荐

