InvalidOperationException: 该应用程序或请求尚未配置会话。

huangapple go评论151阅读模式
英文:

.net 7 Visual Studio Code : InvalidOperationException: Session has not been configured for this application or request

问题

I followed the example of this tutorial (https://www.c-sharpcorner.com/article/simple-login-and-registration-form-in-asp-net-mvc-using-ado-net/) to create a simple registration and login pages for C# MVC .Net Web app.

我按照这个教程的示例(https://www.c-sharpcorner.com/article/simple-login-and-registration-form-in-asp-net-mvc-using-ado-net/)创建了一个简单的C# MVC .Net Web应用程序的注册和登录页面。

I was able to implement the user registration to a local mysql hosted by Xampp.

我成功实现了用户注册到由Xampp托管的本地mysql数据库。

However for the UserLoginController I'm getting the following error:

但是对于UserLoginController,我遇到了以下错误:

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[] )

InvalidOperationException: 尚未为此应用程序或请求配置会话。
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[] )

Below are some of my code and configuration:

以下是我的一些代码和配置:

Startup.cs (I had to add manually because "dotnet new mvc -o Project did not add it")

Startup.cs(我不得不手动添加,因为"dotnet new mvc -o Project"没有添加它)

  1. using Microsoft.AspNetCore.Builder;
  2. using Microsoft.AspNetCore.Hosting;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Hosting;
  5. using Microsoft.AspNetCore.Http;
  6. namespace Project
  7. {
  8. public class Startup
  9. {
  10. public void ConfigureServices(IServiceCollection services)
  11. {
  12. services.AddDistributedMemoryCache();
  13. services.AddSession(options =>
  14. {
  15. options.Cookie.HttpOnly = true;
  16. options.Cookie.IsEssential = true;
  17. });
  18. services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // Add this line
  19. // Other service configurations
  20. }
  21. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  22. {
  23. // Other middleware configurations
  24. app.UseSession();
  25. app.UseRouting();
  26. // Other endpoint and routing configurations
  27. }
  28. }
  29. }

UserLoginController.cs

UserLoginController.cs

  1. using Microsoft.AspNetCore.Mvc;
  2. using System.Data;
  3. using MySql.Data.MySqlClient;
  4. using Project.Models;
  5. using System.Data.SqlClient;
  6. namespace Project.Controllers
  7. {
  8. public class UserLoginController : Controller
  9. {
  10. // GET: /UserLogin/
  11. public string status;
  12. public ActionResult Index()
  13. {
  14. return View();
  15. }
  16. [HttpPost]
  17. public ActionResult Index(Enroll e)
  18. {
  19. string connectionString = "Server=localhost;Port=3306;Database=database;Uid=root;Pwd=root;";
  20. using (MySqlConnection con = new MySqlConnection(connectionString))
  21. {
  22. string sqlQuery = "SELECT Email, Password FROM Enrollment WHERE Email = @Email AND Password = @Password";
  23. con.Open();
  24. MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
  25. cmd.Parameters.AddWithValue("@Email", e.Email);
  26. cmd.Parameters.AddWithValue("@Password", e.Password);
  27. MySqlDataReader reader = cmd.ExecuteReader();
  28. if (reader.Read())
  29. {
  30. HttpContext.Session.SetString("Email", e.Email);
  31. return RedirectToAction("Welcome");
  32. }
  33. else
  34. {
  35. ViewData["Message"] = "User Login Details Failed!!";
  36. }
  37. con.Close();
  38. }
  39. return View();
  40. }
  41. [HttpGet]
  42. public ActionResult Welcome()
  43. {
  44. Enroll user = new Enroll();
  45. DataSet ds = new DataSet();
  46. string connectionString = "Server=localhost;Port=3306;Database=database;Uid=root;Pwd=root;";
  47. using (MySqlConnection con = new MySqlConnection(connectionString))
  48. {
  49. using (MySqlCommand cmd = new MySqlCommand("sp_GetEnrollmentDetails", con))
  50. {
  51. cmd.CommandType = CommandType.StoredProcedure;
  52. cmd.Parameters.AddWithValue("@Email", HttpContext.Session.GetString("Email"));
  53. con.Open();
  54. MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
  55. adapter.Fill(ds);
  56. List<Enroll> userlist = new List<Enroll>();
  57. foreach (DataRow row in ds.Tables[0].Rows)
  58. {
  59. Enroll uobj = new Enroll();
  60. uobj.ID = Convert.ToInt32(row["ID"].ToString());
  61. uobj.FirstName = row["FirstName"].ToString();
  62. uobj.LastName = row["LastName"].ToString();
  63. uobj.Password = row["Password"].ToString();
  64. uobj.Email = row["Email"].ToString();
  65. uobj.PhoneNumber = row["Phone"].ToString();
  66. uobj.SecurityAnswer = row["SecurityAnswer"].ToString();
  67. uobj.Gender = row["Gender"].ToString();
  68. userlist.Add(uobj);
  69. }
  70. user.Enrollsinfo = userlist;
  71. }
  72. con.Close();
  73. }
  74. ViewBag.Email = HttpContext.Session.GetString("Email");
  75. return View(user);
  76. }
  77. public ActionResult Logout()
  78. {
  79. HttpContext.Session.Clear();
  80. return RedirectToAction("Index", "UserLogin");
  81. }
  82. }
  83. }

Index.cshtml

Index.cshtml

  1. @model Project.Enroll
  2. @{
  3. ViewBag.Title = "Index";
  4. }
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta name="viewport" content="width=device-width" />
  9. <title>ENROLLMENT</title>
  10. <link href="http://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css" />
  11. <script type="text/javascript" src="http://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js"></script>
  12. <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  13. <link href="../../Content/StyleSheet.css" rel="stylesheet" type="text/css" />
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $.ajax({
  17. type: 'POST',
  18. URL: '/UserLogin/UserLogin',
  19. data: data,
  20. dataType: 'JSON',
  21. success: function (data) {
  22. datadata = data.status
  23. if (status == "1") {
  24. window.location.href = '@Url.Action("Index","UserLogin")';
  25. }
  26. }
  27. });
  28. });
  29. </script>
  30. </head>
  31. <body>
  32. <!------ Include the above in your HEAD tag ---------->
  33. @using (Html.BeginForm("Index", "UserLogin", FormMethod.Post))
  34. {
  35. @Html.AntiForgeryToken()
  36. <div class="container register">
  37. <div class="row">
  38. <div class="col-md-3 register-left">
  39. <img src="https://image.ibb.co/n7oTvU/logo_white.png" alt="" />
  40. <h3>Welcome</h3>
  41. <p>This Example is for learning MVC Basic Login and Registration Using ADO.NET.</p>
  42. </div>
  43. <div class="col-md-9 register-right">
  44. <ul class="nav nav-tabs nav-justified" id="myTab" role="tablist">
  45. <li
  46. <details>
  47. <summary>英文:</summary>
  48. I followed the example of this tutorial (https://www.c-sharpcorner.com/article/simple-login-and-registration-form-in-asp-net-mvc-using-ado-net/) to create a simple registration and login pages for C# MVC .Net Web app.
  49. I was able to implement the user registration to a local mysql hosted by Xampp
  50. However for the UserLoginController I&#39;m getting the following error:
  51. InvalidOperationException: Session has not been configured for this application or request.
  52. Microsoft.AspNetCore.Http.DefaultHttpContext.get_Session()
  53. Project.UserLoginController.Index(Enroll e) in UserLoginController.cs
  54. +
  55. HttpContext.Session.SetString(&quot;Email&quot;, e.Email);
  56. lambda_method28(Closure , object , object[] )
  57. Below are some of my code and configuration:
  58. Startup.cs (I had to add manually because &quot;dotnet new mvc -o Project did not add it&quot;)
  59. using Microsoft.AspNetCore.Builder;
  60. using Microsoft.AspNetCore.Hosting;
  61. using Microsoft.Extensions.DependencyInjection;
  62. using Microsoft.Extensions.Hosting;
  63. using Microsoft.AspNetCore.Http;
  64. namespace Project
  65. {
  66. public class Startup
  67. {
  68. public void ConfigureServices(IServiceCollection services)
  69. {
  70. services.AddDistributedMemoryCache();
  71. services.AddSession(options =&gt;
  72. {
  73. options.Cookie.HttpOnly = true;
  74. options.Cookie.IsEssential = true;
  75. });
  76. services.AddSingleton&lt;IHttpContextAccessor, HttpContextAccessor&gt;(); // Add this line
  77. // Other service configurations
  78. }
  79. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  80. {
  81. // Other middleware configurations
  82. app.UseSession();
  83. app.UseRouting();
  84. // Other endpoint and routing configurations
  85. }
  86. }
  87. }
  88. UserLoginController.cs
  89. using Microsoft.AspNetCore.Mvc;
  90. using System.Data;
  91. using MySql.Data.MySqlClient;
  92. using Project.Models;
  93. using System.Data.SqlClient;
  94. namespace Project.Controllers
  95. {
  96. public class UserLoginController : Controller
  97. {
  98. // GET: /UserLogin/
  99. public string status;
  100. public ActionResult Index()
  101. {
  102. return View();
  103. }
  104. [HttpPost]
  105. public ActionResult Index(Enroll e)
  106. {
  107. string connectionString = &quot;Server=localhost;Port=3306;Database=database;Uid=root;Pwd=root;&quot;;
  108. using (MySqlConnection con = new MySqlConnection(connectionString))
  109. {
  110. string sqlQuery = &quot;SELECT Email, Password FROM Enrollment WHERE Email = @Email AND Password = @Password&quot;;
  111. con.Open();
  112. MySqlCommand cmd = new MySqlCommand(sqlQuery, con);
  113. cmd.Parameters.AddWithValue(&quot;@Email&quot;, e.Email);
  114. cmd.Parameters.AddWithValue(&quot;@Password&quot;, e.Password);
  115. MySqlDataReader reader = cmd.ExecuteReader();
  116. if (reader.Read())
  117. {
  118. HttpContext.Session.SetString(&quot;Email&quot;, e.Email);
  119. return RedirectToAction(&quot;Welcome&quot;);
  120. }
  121. else
  122. {
  123. ViewData[&quot;Message&quot;] = &quot;User Login Details Failed!!&quot;;
  124. }
  125. con.Close();
  126. }
  127. return View();
  128. }
  129. [HttpGet]
  130. public ActionResult Welcome()
  131. {
  132. Enroll user = new Enroll();
  133. DataSet ds = new DataSet();
  134. string connectionString = &quot;Server=localhost;Port=3306;Database=database;Uid=root;Pwd=root;&quot;;
  135. using (MySqlConnection con = new MySqlConnection(connectionString))
  136. {
  137. using (MySqlCommand cmd = new MySqlCommand(&quot;sp_GetEnrollmentDetails&quot;, con))
  138. {
  139. cmd.CommandType = CommandType.StoredProcedure;
  140. cmd.Parameters.AddWithValue(&quot;@Email&quot;, HttpContext.Session.GetString(&quot;Email&quot;));
  141. con.Open();
  142. MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);
  143. adapter.Fill(ds);
  144. List&lt;Enroll&gt; userlist = new List&lt;Enroll&gt;();
  145. foreach (DataRow row in ds.Tables[0].Rows)
  146. {
  147. Enroll uobj = new Enroll();
  148. uobj.ID = Convert.ToInt32(row[&quot;ID&quot;].ToString());
  149. uobj.FirstName = row[&quot;FirstName&quot;].ToString();
  150. uobj.LastName = row[&quot;LastName&quot;].ToString();
  151. uobj.Password = row[&quot;Password&quot;].ToString();
  152. uobj.Email = row[&quot;Email&quot;].ToString();
  153. uobj.PhoneNumber = row[&quot;Phone&quot;].ToString();
  154. uobj.SecurityAnswer = row[&quot;SecurityAnswer&quot;].ToString();
  155. uobj.Gender = row[&quot;Gender&quot;].ToString();
  156. userlist.Add(uobj);
  157. }
  158. user.Enrollsinfo = userlist;
  159. }
  160. con.Close();
  161. }
  162. ViewBag.Email = HttpContext.Session.GetString(&quot;Email&quot;);
  163. return View(user);
  164. }
  165. public ActionResult Logout()
  166. {
  167. HttpContext.Session.Clear();
  168. return RedirectToAction(&quot;Index&quot;, &quot;UserLogin&quot;);
  169. }
  170. }
  171. }
  172. Index.cshtml
  173. @model Project.Enroll
  174. @{
  175. ViewBag.Title = &quot;Index&quot;;
  176. }
  177. &lt;!DOCTYPE html&gt;
  178. &lt;html&gt;
  179. &lt;head&gt;
  180. &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&gt;
  181. &lt;title&gt;ENROLLMENT&lt;/title&gt;
  182. &lt;link href=&quot;http://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css&quot; rel=&quot;stylesheet&quot; id=&quot;bootstrap-css&quot;/&gt;
  183. &lt;script type=&quot;text/javascript&quot; src=&quot;http://maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;
  184. &lt;script type=&quot;text/javascript&quot; src=&quot;http://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js&quot;&gt;&lt;/script&gt;
  185. &lt;link href=&quot;../../Content/StyleSheet.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
  186. &lt;script type=&quot;text/javascript&quot;&gt;
  187. $(document).ready(function () {
  188. $.ajax({
  189. type: &#39;POST&#39;,
  190. URL: &#39;/UserLogin/UserLogin&#39;,
  191. data: data,
  192. dataType: &#39;JSON&#39;,
  193. success: function (data) {
  194. datadata = data.status
  195. if (status == &quot;1&quot;) {
  196. window.location.href = &#39;@Url.Action(&quot;Index&quot;,&quot;UserLogin&quot;)&#39;;
  197. }
  198. }
  199. });
  200. });
  201. &lt;/script&gt;
  202. &lt;/head&gt;
  203. &lt;body&gt;
  204. &lt;!------ Include the above in your HEAD tag ----------&gt;
  205. @using (Html.BeginForm(&quot;Index&quot;, &quot;UserLogin&quot;, FormMethod.Post))
  206. {
  207. @Html.AntiForgeryToken()
  208. &lt;div class=&quot;container register&quot;&gt;
  209. &lt;div class=&quot;row&quot;&gt;
  210. &lt;div class=&quot;col-md-3 register-left&quot;&gt;
  211. &lt;img src=&quot;https://image.ibb.co/n7oTvU/logo_white.png&quot; alt=&quot;&quot;/&gt;
  212. &lt;h3&gt;Welcome&lt;/h3&gt;
  213. &lt;p&gt;This Example is for learning MVC Basic Login and Registration Using ADO.NET.&lt;/p&gt;
  214. &lt;/div&gt;
  215. &lt;div class=&quot;col-md-9 register-right&quot;&gt;
  216. &lt;ul class=&quot;nav nav-tabs nav-justified&quot; id=&quot;myTab&quot; role=&quot;tablist&quot;&gt;
  217. &lt;li class=&quot;nav-item&quot;&gt;
  218. &lt;a class=&quot;nav-link active&quot; id=&quot;home-tab&quot; data-toggle=&quot;tab&quot; href=&quot;../Enrollment/Index&quot; role=&quot;tab&quot; aria-controls=&quot;home&quot; aria-selected=&quot;true&quot;&gt;Register&lt;/a&gt;
  219. &lt;/li&gt;
  220. &lt;li class=&quot;nav-item&quot;&gt;
  221. &lt;a class=&quot;nav-link&quot; id=&quot;profile-tab&quot; data-toggle=&quot;tab&quot; href=&quot;../UserLogin/Index&quot; role=&quot;tab&quot; aria-controls=&quot;profile&quot; aria-selected=&quot;false&quot;&gt;Login&lt;/a&gt;
  222. &lt;/li&gt;
  223. &lt;/ul&gt;
  224. &lt;div class=&quot;tab-content&quot; id=&quot;myTabContent&quot;&gt;
  225. &lt;div class=&quot;tab-pane fade show active&quot; id=&quot;home&quot; role=&quot;tabpanel&quot; aria-labelledby=&quot;home-tab&quot;&gt;
  226. &lt;h3 class=&quot;register-heading&quot;&gt;Login as a Employee&lt;/h3&gt;
  227. &lt;div class=&quot;row register-form&quot;&gt;
  228. &lt;div class=&quot;col-md-6&quot;&gt;
  229. &lt;div class=&quot;form-group&quot;&gt;
  230. @Html.TextBoxFor(e =&gt; e.Email, new { @class = &quot;form-control&quot;, placeholder = &quot;Your Email *&quot; })
  231. @Html.ValidationMessageFor(e =&gt; e.Email)
  232. &lt;/div&gt;
  233. &lt;div class=&quot;form-group&quot;&gt;
  234. @Html.PasswordFor(e =&gt; e.Password, new { id = &quot;password&quot;, @class = &quot;form-control&quot;, placeholder = &quot;Password *&quot; })
  235. &lt;span id=&quot;result&quot;&gt;&lt;/span&gt;
  236. @Html.ValidationMessageFor(e =&gt; e.Password)
  237. &lt;/div&gt;
  238. &lt;div class=&quot;col-md-6&quot;&gt;
  239. &lt;input type=&quot;submit&quot; class=&quot;btnLogin&quot; value=&quot;Login&quot;/&gt;
  240. &lt;/div&gt;
  241. &lt;/div&gt;
  242. &lt;/div&gt;
  243. &lt;/div&gt;
  244. &lt;/div&gt;
  245. &lt;/div&gt;
  246. &lt;/div&gt;
  247. &lt;script type=&quot;text/javascript&quot;&gt;
  248. $(function () {
  249. var msg = &#39;@ViewData[&quot;result&quot;]&#39;;
  250. if (msg == &#39;1&#39;)
  251. {
  252. alert(&quot;User Details Inserted Successfully&quot;);
  253. window.location.href = &quot;@Url.Action(&quot;Index&quot;, &quot;UserLogin&quot;)&quot;;
  254. }
  255. });
  256. &lt;/script&gt;
  257. }
  258. &lt;/div&gt;
  259. }
  260. &lt;/body&gt;
  261. &lt;/html&gt;
  262. </details>
  263. # 答案1
  264. **得分**: 1
  265. 在.Net 6之前,我们在`Startup.cs`文件中配置服务和中间件,但在.Net 6之后,Asp.Net-Core移除了`Startup.cs`文件,而是使用`Program.cs`文件来配置服务和中间件。
  266. 因此,您不需要手动添加`Startup.cs`文件,可以像这样在`Program.cs`中配置会话:
  267. ```csharp
  268. var builder = WebApplication.CreateBuilder(args);
  269. // 向容器添加其他服务
  270. builder.Services.AddSession(options =>
  271. {
  272. options.Cookie.HttpOnly = true;
  273. options.Cookie.IsEssential = true;
  274. });
  275. var app = builder.Build();
  276. // 配置HTTP请求管道
  277. // 添加其他中间件
  278. app.UseSession();
  279. // 添加其他中间件
  280. app.Run();
英文:

Pior to .Net 6, We configure service and middleware in Startup.cs file, But after .Net 6, Asp.Net-Core remove Startup.cs file and use Program.cs file to configure service and middleware.

So you not need to add Startup.cs file manually, Configure session in Program.cs like this:

  1. var builder = WebApplication.CreateBuilder(args);
  2. // Add services to the container.
  3. //other service
  4. builder.Services.AddSession(options =&gt;
  5. {
  6. options.Cookie.HttpOnly = true;
  7. options.Cookie.IsEssential = true;
  8. });
  9. var app = builder.Build();
  10. // Configure the HTTP request pipeline.
  11. //other middleWare
  12. app.UseSession();
  13. //other middleWare
  14. app.Run();

答案2

得分: 0

在 .NET Core 中,我们可以使用以下方式来设置和获取会话值。

要设置会话值,请考虑以下语法。

示例:HttpContext.Session.SetString("login", "传入我们的值");

要在视图中获取会话值,请考虑以下语法。

示例:

  1. @using Microsoft.AspNetCore.Http
  2. @inject IHttpContextAccessor httpContextAccessor
  3. @httpContextAccessor.HttpContext.Session.GetString("login")
英文:

In .net core below way we can set & get session value.

For set session value please consider below syntax.

Example : HttpContext.Session.SetString("login", "pass our value");

For get session value inside view, please consider below syntax

Example:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor httpContextAccessor

@httpContextAccessor.HttpContext.Session.GetString("login")

huangapple
  • 本文由 发表于 2023年6月26日 03:01:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/76552000.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定