ASP.NET Core 是一个跨平台,开源的,轻量级,高性能 并且 高度模块化的web框架,Session 可以实现用户信息存储从而可以在同一个客户端的多次请求之间实现用户追踪,在 ASP.Net Core 中可以使用 Microsoft.AspNetCore.Session 中间件来启用 Session 机制。

中间件的价值在于可以在 request -> response 的过程中做一些定制化的操作,比如说:监视数据,切换路由,修改流转过程中的消息体,通常来说:中间件是以链式的方式灌入到 ASP.Net Core 的 pipeline 管道中,这篇文章主要讨论如何使用 Session 中间件。

安装 Session 中间件

要想使用 session 中间件,你可以使用 Visual Studio 2019 中的 NuGet package manager 可视化界面进行安装,或者通过 NuGet package manager console 命令行输入如下命令:

Install-Package Microsoft.AspNetCore.Session

配置 session 中间件

现在 Microsoft.AspNetCore.Session 已经成功安装到你的项目中了,接下来可以将它添加到 ASP.Net Core pipeline 中,请注意:为了能够启动 Session,你必须要使用一个 实现了 IDistributedCache 接口的 cache store 来作为 session 的底层存储,然后你还要在 ConfigureServices 方法下调用 AddSession 方法将其塞入 IOC 容器,最后在 Startup.Configure 方法下使用 UseSession 将其塞入到 request -> response 请求管道中,具体代码如下:

  public void ConfigureServices(IServiceCollection services)
  {
    services.AddDistributedMemoryCache();
    services.AddSession(options =>
    {
      options.IdleTimeout = TimeSpan.FromSeconds(5);
      options.Cookie.HttpOnly = true;
      options.Cookie.IsEssential = true;
    });
    services.AddMvc()
      .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  }

一旦 session 中间件加入到了 IOC 容器之后,接下来可以在 Configure 方法中调用 UseSession 来启动 session。

  public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  {
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseSession();
    app.UseHttpContextItemsMiddleware();
    app.UseMvc();
  }

存储和获取 session

你可以使用 Set, SetInt32 和 SetString 这三个方法来实现 Session 的存储,这些方法有两个参数,一个是键,一个是键对应的数据,而且 Set 方法的 value 对应的是 byte[] 形式。

类似的,你可以使用 Get,GetInt32 和 GetString 方法来实现 session 的读取,同时 Get 方法接收一个 string 格式的 key,并且返回 byte[] 数组,要使用这些扩展方法,你需要将 Microsoft.AspNetCore.Http 引用到项目中。

下面的代码展示了如何将数据添加到 session 中。

public IActionResult Index()
{
  HttpContext.Session.SetString("Message", "Hello World!");
  HttpContext.Session.SetInt32("Year", 2019);
  return View();
}

接下来再看看如何从 session 中获取数据,如下代码所示:

public IActionResult About()
{
  ViewBag.Message = HttpContext.Session.GetString("Message");
  ViewBag.Year = HttpContext.Session.GetInt32("Year");
  return View();
}

如果你想设置或者获取属于其他类型的数据,可以在 ISession 接口上新增一个扩展方法并且自己来实现序列化逻辑,从 session 中设置或者获取 复杂类型时,可以把这个类型序列化为 json,或者 json 反序列化为 model。

还有一点要特别注意,默认的 session 是基于内存的,也就是说进程关闭了 session 就会丢失,如果你想实现session持久化,可以采用 sqlserver 或者 redis。

译文链接:https://www.infoworld.com/article/3411563/how-to-work-with-session-state-in-aspnet-core.html

华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com

稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!

昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。

这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。

而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?