如何在ASP.Net Core中使用会话存储

为了将特定于用户的数据存储在ASP.Net Core Web应用程序中,我们使用会话状态。 但是,在ASP.Net Core中使用会话状态并非易事-至少,ASP.Net Core中的会话状态无法像以前在旧版ASP.Net应用程序中那样工作。 本文研究如何在ASP.Net Core中处理会话状态。

[更深入: 如何开始使用WebAssembly WebAssembly的下一步是什么 8个使WebAssembly崭露头角的项目 •那么, WebAssembly的下一步究竟是什么? | 通过InfoWorld的App Dev Report新闻通讯了解编程方面的热门话题。 ]

创建一个ASP.Net Core Web API项目

首先,让我们创建一个ASP.Net Core项目并安装必要的软件包。 如果您的系统已启动并运行Visual Studio 2017,请按照下面概述的步骤创建一个ASP.Net Core Web API项目。

  1. 启动Visual Studio 2017 IDE。
  2. 单击文件>新建>项目。
  3. 从显示的模板列表中选择“ ASP.Net Core Web应用程序(.Net Core)”。
  4. 指定项目的名称。
  5. 单击确定保存项目。
  6. 在“新的.Net Core Web应用程序…”窗口中选择“ API”。
  7. 从顶部的控件下拉列表中选择“ .Net Core”作为运行时,并选择ASP.Net Core 2.1(或更高版本)。
  8. 选择“ Web应用程序(模型-视图-控制器)”作为项目模板。
  9. 取消选中“启用Docker支持”框。
  10. 确保选择了“无身份验证”,因为我们此处将不使用身份验证。
  11. 确保未选中“配置HTTPS”,因为我们也不需要HTTPS。 (请参见下图。)
  12. 单击确定。

这将在Visual Studio 2017中创建一个新的ASP.Net Core 2.1 MVC项目。

asp.net核心项目模板 IDG

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值