.NET 7 MVC登录时遇InvalidOperationException:Session未配置问题求助
问题:ASP.NET MVC登录时Session未配置错误
登录验证通过后执行HttpContext.Session.SetString("Email", e.Email)时抛出错误:
InvalidOperationException: Session has not been configured for this application or request. Microsoft.AspNetCore.Http.DefaultHttpContext.get_Session() Project.UserLoginController.Index(Enroll e) in UserLoginController.cs + HttpContext.Session.SetString("Email", e.Email); lambda_method28(Closure , object , object[] )
现有代码片段
Startup.cs(手动创建)
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.AspNetCore.Http; namespace Project { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddDistributedMemoryCache(); services.AddSession(options => { options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // Add this line // Other service configurations } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // Other middleware configurations app.UseSession(); app.UseRouting(); // Other endpoint and routing configurations } } }
UserLoginController.cs
using Microsoft.AspNetCore.Mvc; using System.Data; using MySql.Data.MySqlClient; using Project.Models; using System.Data.SqlClient; namespace Project.Controllers { public class UserLoginController : Controller { // GET: /UserLogin/ public string status; public ActionResult Index() { return View(); } [HttpPost] public ActionResult Index(Enroll e) { string connectionString = "Server=localhost;Port=3306;Database=database;Uid=root;Pwd=root;"; using (MySqlConnection con = new MySqlConnection(connectionString)) { string sqlQuery = "SELECT Email, Password FROM Enrollment WHERE Email = @Email AND Password = @Password"; con.Open(); MySqlCommand cmd = new MySqlCommand(sqlQuery, con); cmd.Parameters.AddWithValue("@Email", e.Email); cmd.Parameters.AddWithValue("@Password", e.Password); MySqlDataReader reader = cmd.ExecuteReader(); if (reader.Read()) { HttpContext.Session.SetString("Email", e.Email); return RedirectToAction("Welcome"); } else { ViewData["Message"] = "User Login Details Failed!!"; } con.Close(); } return View(); } [HttpGet] public ActionResult Welcome() { Enroll user = new Enroll(); DataSet ds = new DataSet(); string connectionString = "Server=localhost;Port=3306;Database=database;Uid=root;Pwd=root;"; using (MySqlConnection con = new MySqlConnection(connectionString)) { using (MySqlCommand cmd = new MySqlCommand("sp_GetEnrollmentDetails", con)) { cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("@Email", HttpContext.Session.GetString("Email")); con.Open(); MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); adapter.Fill(ds); List<Enroll> userlist = new List<Enroll>(); foreach (DataRow row in ds.Tables[0].Rows) { Enroll uobj = new Enroll(); uobj.ID = Convert.ToInt32(row["ID"].ToString()); uobj.FirstName = row["FirstName"].ToString(); uobj.LastName = row["LastName"].ToString(); uobj.Password = row["Password"].ToString(); uobj.Email = row["Email"].ToString(); uobj.PhoneNumber = row["Phone"].ToString(); uobj.SecurityAnswer = row["SecurityAnswer"].ToString(); uobj.Gender = row["Gender"].ToString(); userlist.Add(uobj); } user.Enrollsinfo = userlist; } con.Close(); } ViewBag.Email = HttpContext.Session.GetString("Email"); return View(user); } public ActionResult Logout() { HttpContext.Session.Clear(); return RedirectToAction("Index", "UserLogin"); } } }
Index.cshtml
@model Project.Enroll @{ ViewBag.Title = "Index"; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>ENROLLMENT</title> <link href="http://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"/> <script type="text/javascript" src="http://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script> <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> <link href="../../Content/StyleSheet.css" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $(document).ready(function () { $.ajax({ type: 'POST', URL: '/UserLogin/UserLogin', data: data, dataType: 'JSON', success: function (data) { datadata = data.status if (status == "1") { window.location.href = '@Url.Action("Index","UserLogin")'; } } }); }); </script> </head> <body> <!------ Include the above in your HEAD tag ----------> @using (Html.BeginForm("Index", "UserLogin", FormMethod.Post)) { @Html.AntiForgeryToken() <div class="container register"> <div class="row"> <div class="col-md-3 register-left"> <img src="https://image.ibb.co/n7oTvU/logo_white.png" alt=""/> <h3>Welcome</h3> <p>This Example is for learning MVC Basic Login and Registration Using ADO.NET.</p> </div> <div class="col-md-9 register-right"> <ul class="nav nav-tabs nav-justified" id="myTab" role="tablist"> <li class="nav-item"> <a class="nav-link active" id="home-tab" data-toggle="tab" href="../Enrollment/Index" role="tab" aria-controls="home" aria-selected="true">Register</a> </li> <li class="nav-item"> <a class="nav-link" id="profile-tab" data-toggle="tab" href="../UserLogin/Index" role="tab" aria-controls="profile" aria-selected="false">Login</a> </li> </ul> <div class="tab-content" id="myTabContent"> <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab"> <h3 class="register-heading">Login as a Employee</h3> <div class="row register-form"> <div class="col-md-6"> <div class="form-group"> @Html.TextBoxFor(e => e.Email, new { @class = "form-control", placeholder = "Your Email *" }) @Html.ValidationMessageFor(e => e.Email) </div> <div class="form-group"> @Html.PasswordFor(e => e.Password, new { id = "password", @class = "form-control", placeholder = "Password *" }) <span id="result"></span> @Html.ValidationMessageFor(e => e.Password) </div> <div class="col-md-6"> <input type="submit" class="btnLogin" value="Login"/> </div> </div> </div> </div> </div> </div> </div> <script type="text/javascript"> $(function () { var msg = '@ViewData["result"]'; if (msg == '1') { alert("User Details Inserted Successfully"); window.location.href = "@Url.Action("Index", "UserLogin")"; } }); </script> } </div> } </body> </html>
解决方案
1. 完善Startup.cs中的服务注册
在ConfigureServices方法中添加MVC控制器与视图的核心服务注册,这是ASP.NET MVC项目运行的必要依赖:
public void ConfigureServices(IServiceCollection services) { services.AddDistributedMemoryCache(); services.AddSession(options => { options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; options.IdleTimeout = TimeSpan.FromMinutes(30); // 可选:设置Session过期时间 }); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // 添加MVC核心服务 services.AddControllersWithViews(); }
2. 调整中间件顺序
Session中间件的执行位置必须严格遵循ASP.NET Core的中间件规则:
- 需放在
UseStaticFiles之后 - 需放在
UseRouting和UseAuthorization之前 - 需放在
UseEndpoints之前
修改Configure方法:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // 正确配置Session中间件位置 app.UseSession(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
3. 额外优化(可选)
- 移除
Index.cshtml中无效AJAX代码:该请求指向不存在的UserLoginAction,且data变量未定义,会导致页面加载报错 - 确认数据库连接字符串中的
Database名称与实际MySQL数据库名一致
内容的提问来源于stack exchange,提问作者Werner
相关产品推荐
相关产品推荐

