夸克之书

  • 首页
  • 科普
  • 笔记
  • C#
  • 物联网
  • 算法
  • Linux
  • 树莓派
夸克之内,别有洞天
  1. 首页
  2. C#
  3. 正文

在ASP.NET Core中使用Redis作为Session

2019-05-13 1568点热度 0人点赞 0条评论

前言

Session 是保存用户和 Web 应用的会话状态的一种方法,ASP.NET Core 提供了一个用于管理会话状态的中间件。在本文中我将会简单介绍一下 ASP.NET Core 将Redis作为 Session 的使用方法。

要将Redis作为Session的前提条件是安装并启用了Session,并在Nuget中安装以下两个包:

  • Microsoft.AspNetCore.Session
  • Microsoft.Extensions.Caching.Redis

Windows版Redis下载地址:https://github.com/MSOpenTech/redis/releases/download/win-3.2.100/Redis-x64-3.2.100.msi

使用

需要注意的一点是,要使用Session,必须将

services.Configure<CookiePolicyOptions>(options =>
{
  options.CheckConsentNeeded = context => true;
  options.MinimumSameSitePolicy = SameSiteMode.None;
});

中的options.CheckConsentNeeded = context => true;修改为options.CheckConsentNeeded = context => false;true表示用户是否同意cookie协议。当为true时而又无弹窗提示用户是否同意时,将导致session无法回传,故设置为false才可正常使用session。因为SessionID是存放在用户浏览器Cookie当中的,如果不回传SessionId,肯定就没法获取当前设置的Session。

1、Redis连接字符串

在appsettings.json中添加Redis连接字符串。

"ConnectionStrings": {
    "RedisSessionConnectionString": "127.0.0.1:6379,password=easy_net_770702827,ConnectTimeout=3000,defaultdatabase=1"
  },

2、配置

在Startup.cs中的 ConfigureServices方法下添加:

//获取连接字符串
var sessionConnectionString = Configuration.GetConnectionString("RedisSessionConnectionString");
//使用Session
services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30);
    options.Cookie.HttpOnly = true;
});
//使用Redis作为Session缓存
services.AddDistributedRedisCache(options => 
{
    options.Configuration = sessionConnectionString;
    options.InstanceName = "HFMSCache";
});

此时 ConfigureServices 方法如下所示:

public void ConfigureServices(IServiceCollection services)
{
    var sessionConnectionString = Configuration.GetConnectionString("RedisSessionConnectionString");
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for non-essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    //使用Session
    services.AddSession(options =>
    {
        options.IdleTimeout = TimeSpan.FromMinutes(30);
        options.Cookie.HttpOnly = true;
    });
    //使用Redis作为Session缓存
    services.AddDistributedRedisCache(options =>
    {
        options.Configuration = sessionConnectionString;
        options.InstanceName = "HFMSCache";
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

3、启用Session

在Configure方法中添加:

app.UseSession();

注意:UseSession必须在UseMvc之前!

此时 Configure 方法如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseStaticFiles();
    app.UseCookiePolicy();

    app.UseSession();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

4、测试

在HomeController下面修改方法Index和添加方法Set。分别是设置Session和获取Session,这里就不再赘述,直接列出代码。

public IActionResult Index()
{
    string user = HttpContext.Session.GetString("USER");
    if (string.IsNullOrEmpty(user))
    {
        ViewBag.Value = "Get user data failed.";
    }
    else
    {
        ViewBag.Value = user;
    }
    return View();
}

public IActionResult Set()
{
    HttpContext.Session.SetString("USER", "https://www.quarkbook.com/");
    return Content("Set value successful.");
}

运行结果:

在ASP.NET Core中使用Redis作为Session插图
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2020-12-13

Afirefish

夸克之内,别有洞天

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

Afirefish

夸克之内,别有洞天

搜索文章
分类目录
  • C# (28)
  • Linux (3)
  • 树莓派 (13)
  • 物联网 (19)
  • 科普 (4)
  • 笔记 (30)
  • 默认 (44)
最新 热点 随机
最新 热点 随机
树莓派PWM风扇控制 PVE重启后LVM Thin数据丢失,错误:Volume group "****" has insufficient free space (128 extents): 4048 required. OpenWrt配置SmartDNS OpenWrt x86安装Frpc Intel网卡开机显示Initializing Intel(R) Boot Agent GE v1.5.50 IdentityServer4证书创建 免费本地解析域名(locallocal.cn),支持HTTPS 使用淘宝npm以及安装cnpm
你见过哪些有趣的代码?修改PostgreSQL数据库默认用户postgres密码在VS Code开发Arduino项目Error response from daemon: cannot stop container: ******: Cannot kill container *******:.....单机Docker搭建FastDFSC# Json序列化时将长整型(long)属性序列化为Json字符串使用淘宝npm以及安装cnpm免费本地解析域名(locallocal.cn),支持HTTPS
近期学习计划整理 C#中抽象类(abstract)和接口(interface)的相同点与区别 国内软件耻辱柱 Chrome显示完整URL和HTTP协议 计算函数“System.Data.Entity.Insfrastructure.DbQuery.ToString()”超时 树莓派.Net Core Iot入门系列篇(6):PWM 几种常见的开源协议详解 .NET Core Mysql EF主键自增
最近评论
发布于 2 周前(02月21日) 好的谢谢,那我只能通过kill杀死推流指令进程来实现了。
发布于 2 周前(02月21日) 要用这个项目的话,你得自己拉代码来改了。做这玩意儿主要是考虑全天候的,没考虑过关[笑哭]
发布于 2 周前(02月21日) 就是想问有没有能通过代码控制的关闭推流的指令,而不需要手动控制。我想设置一个按钮来控制开始推流和结束...
发布于 2 周前(02月20日) 唔,没懂你意思,直接拔电源不就行了。不拔电源关闭推流服务也行撒。
发布于 2 周前(02月20日) 你好,我想问一下,如果不想推流了,该用什么方法停止树莓派推流呢?
书签
  • 打赏
  • 毒鸡汤(有点意思)
  • 米店
  • 金鱼直播间
放松一下
https://www.quarkbook.com/wp-content/uploads/2020/09/Yanni-Nightingale.flac
用户您好!请先登录!
登录 注册

COPYRIGHT © 2020 夸克之书. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

蜀ICP备15036129号-9

登录
注册|忘记密码?