ASP.NET MVC使用Session时提示HttpSessionStateBase在System.Web中找不到
问题根源
你当前使用的是 ASP.NET Core MVC 框架,但代码里引入了仅适用于 ASP.NET Framework 的 System.Web 相关命名空间,两类框架的Session实现完全不兼容,所以会抛出找不到HttpSessionStateBase的错误。
解决方案
1. 修正控制器引用与代码
首先移除控制器头部错误的命名空间引用,替换为Core对应的引用,同时修改Session读写语法:
// 移除这两行 // using System.Web; // using System.Web.Mvc; // 新增Core对应的引用 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using System.Linq; using PresupuestosPruebas.Models; namespace PresupuestosPruebas.Controllers { public class HomeController : Controller { public ActionResult Login() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Login(Usuario objUser) { if (ModelState.IsValid) { using (ASHPF_PRESUPUESTOSContext db = new ASHPF_PRESUPUESTOSContext()) { var obj = db.Usuarios.Where(a => a.NombreUsuario.Equals(objUser.NombreUsuario) && a.ContraseñaUsuario.Equals(objUser.ContraseñaUsuario)).FirstOrDefault(); if (obj != null) { // 替换为Core的Session写入语法 HttpContext.Session.SetString("IdUsuario", obj.IdUsuario.ToString()); HttpContext.Session.SetString("NombreUsuario", obj.NombreUsuario.ToString()); return RedirectToAction("UserDashboard"); } } } return View(objUser); } public ActionResult UserDashBoard() { // 替换为Core的Session读取语法 if (!string.IsNullOrEmpty(HttpContext.Session.GetString("IdUsuario"))) { return View(); } else { return RedirectToAction("Login"); } } } }
2. 优化Startup配置
移除Startup.cs里重复冗余的注册代码,同时完善Session配置:
using System; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.HttpsPolicy; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using PresupuestosPruebas.Models; // 移除错误引用 // using System.Web.Mvc; namespace PresupuestosPruebas { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ASHPF_PRESUPUESTOSContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); // 移除重复的AddControllersWithViews注册 services.AddControllersWithViews(); // 完善Session配置,可按需调整过期时间 services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // 注意UseSession必须放在UseRouting之前,当前顺序是对的 app.UseSession(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); } } }
内容的提问来源于stack exchange,提问作者Eder Savillon
相关产品推荐
相关产品推荐

