为了将特定于用户的数据存储在ASP.Net Core Web应用程序中,我们使用会话状态。 但是,在ASP.Net Core中使用会话状态并非易事-至少,ASP.Net Core中的会话状态无法像以前在旧版ASP.Net应用程序中那样工作。 本文研究如何在ASP.Net Core中处理会话状态。
创建一个ASP.Net Core Web API项目
首先,让我们创建一个ASP.Net Core项目并安装必要的软件包。 如果您的系统已启动并运行Visual Studio 2017,请按照下面概述的步骤创建一个ASP.Net Core Web API项目。
- 启动Visual Studio 2017 IDE。
- 单击文件>新建>项目。
- 从显示的模板列表中选择“ ASP.Net Core Web应用程序(.Net Core)”。
- 指定项目的名称。
- 单击确定保存项目。
- 在“新的.Net Core Web应用程序…”窗口中选择“ API”。
- 从顶部的控件下拉列表中选择“ .Net Core”作为运行时,并选择ASP.Net Core 2.1(或更高版本)。
- 选择“ Web应用程序(模型-视图-控制器)”作为项目模板。
- 取消选中“启用Docker支持”框。
- 确保选择了“无身份验证”,因为我们此处将不使用身份验证。
- 确保未选中“配置HTTPS”,因为我们也不需要HTTPS。 (请参见下图。)
- 单击确定。
这将在Visual Studio 2017中创建一个新的ASP.Net Core 2.1 MVC项目。
![asp.net核心项目模板](https://i-blog.csdnimg.cn/blog_migrate/88777745366446d6bf5de16c76609ffe.png)
在Visual Studio 2017中创建一个新的ASP.Net Core MVC项目。
安装ASP.Net Core会话状态中间件
要启动并运行会话,我们必须将Microsoft.AspNetCore.Session NuGet包添加到我们的项目中。 为此,请在“解决方案资源管理器”窗口中选择新创建的项目,然后右键单击并选择“ Manage NuGet Packages…”选项以打开NuGet Package Manager窗口。 接下来,搜索Microsoft.AspNetCore.Session NuGet程序包并安装它。
配置ASP.Net Core会话状态中间件
下一步是添加用于处理会话状态和配置HTTP请求管道的服务。 这是在Startup.cs文件的ConfigureServices方法中添加服务的方法。
public void ConfigureServices(IServiceCollection services)
{
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(1);
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
接下来,您可以在Startup.cs文件的Configure方法中为应用程序启用会话状态,如下面的代码片段所示。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseSession();
app.UseMvc();
}
这就是配置。 在下面的部分中,我们将研究如何在控制器方法中使用会话状态。
在ASP.Net Core中存储和检索会话数据
用户会话数据存储在键值对中。 您可以使用HttpContext.Session获取会话对象,其中HttpContext表示当前上下文。 您可以使用HttpContext.Session.SetString()方法存储字符串,而可以使用HttpContext.Session.GetString()方法根据会话中的键检索字符串。 以下代码段说明了如何使用这些方法。
public class HomeController : Controller
{
public IActionResult Index()
{
HttpContext.Session.SetString(“Key”, “This is a test message.”);
return View();
}
public IActionResult About()
{
string message = HttpContext.Session.GetString(“Key”);
ViewData[“Message”] = message;
return View();
}
}
检查ASP.Net Core中的会话是否已过期
请注意,我们在Startup.cs文件的ConfigureServices方法中将会话存储的IdleTimeout设置为一分钟。 因此,在闲置一分钟后,会话数据将丢失。 我们可以更新前面显示的代码,以检查会话是否仍然存在,即,会话对象不为空。 这是HomeController类的更新代码,以供参考。
public class HomeController : Controller
{
public IActionResult Index()
{
HttpContext.Session.SetString(“Key”, “This is a test message.”);
return View();
}
public IActionResult About()
{
string message = null;
if (HttpContext.Session != null)
{
message = HttpContext.Session.GetString(“Key”);
if(string.IsNullOrEmpty(message))
message =“Session timed out.”;
}
ViewData[“Message”] = message;
return View();
}
}
在ASP.Net Core中的会话中存储复杂对象
如果要在会话中存储复杂的数据,则可以创建一个扩展类,以适当地序列化和反序列化对象,如下面的代码片段所示。
public static class SessionCoreExtensions
{
public static void Add<T>(this ISession iSession, string key, T data)
{
string serializedData = JsonConvert.SerializeObject(data);
iSession.SetString(key, serializedData);
}
public static T Get<T>(this ISession iSession, string key)
{
var data = iSession.GetString(key);
if(null != data)
return JsonConvert.DeserializeObject<T>(data);
return default(T);
}
}
假设您有一个称为Author的POCO(普通旧类对象),则可以存储一个复杂的对象,如下面的代码片段所示。
var author = new Author();
HttpContext.Session.Add<author>(“Key”, author);
要从会话中检索复杂对象,可以使用以下代码。
var obj = HttpContext.Session.Get<Author>(“Key”);
HTTP是无状态协议。 HTTP世界中的每个请求都是绝对隔离的。 会话状态管理内置于旧版ASP.Net中,而精简的ASP.Net Core要求我们添加Microsoft.AspNetCore.Session中间件来支持它。 尽管ASP.Net Core的工作原理稍有不同,但存储会话状态仍然很容易在需要时执行。
From: https://www.infoworld.com/article/3317574/how-to-use-session-storage-in-aspnet-core.html