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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 18:25:00