首页 > Web开发 > 详细

.net core 3.0/3.1session持久化redis,session id为空

时间:2020-05-15 09:10:22      阅读:96      评论:0      收藏:0      [点我收藏+]
原文:.net core 3.0/3.1session持久化redis,session id为空

  .net core 3.1中将session持久化到redis,从core1.0开始,2.0/2.1,3.0/3.1每次搭建开发框架都因为session的问题搞的头大,次次踩坑,花了半天时间再次捋了一遍,发出来如果大家有跟我一样,希望能帮到你,另外如果有帮到你,记得点赞哈!!!

1.需引入的库文件

 1.1:Microsoft.AspNetCore.Http.Extensions,因为.net core中的session默认只能存储字节,所以引入该库是为了解决session存储字符串

2.Microsoft.AspNetCore.Session,Microsoft.Extensions.Caching.Redis,针对session扩展

3.StackExchange.Redis为redis驱动

4.Newtonsoft.Json我自己项目常使用的序列化工具,可根据自己的需求使用

项目针对session持久化redis的配置

1
2
3
4
5
6
7
"SessoinConfig": { // Session配置
    "RedisCacheConfig": {
      "ConnectionString": "ip:端口,ssl=false,password=密码,defaultdatabase=redis库索引",
      "InstanceName": "自定义实例名"
    },
    "SessionTimeOut": 60 //session过期时长,分钟
  }

注入实体类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/// <summary>
/// Session缓存配置
/// </summary>
public class SessoinConfig
{
    /// <summary>
    /// session过期时长,分钟
    /// </summary>
    public int SessionTimeOut { get; set; }
 
    /// <summary>
    /// 实例库索引
    /// </summary>
    public RedisCacheConfigData RedisCacheConfig { get; set; }
}
 
/// <summary>
/// Session持久化Redis配置
/// </summary>
public class RedisCacheConfigData
{
    /// <summary>
    /// Redis连接字符串
    /// </summary>
    public string ConnectionString { get; set; }
 
    /// <summary>
    /// Redis实例名称
    /// </summary>
    public string InstanceName { get; set; }
}

IServiceCollection扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// Session持久化至Redis
/// </summary>
/// <param name="services"></param>
/// <param name="Configuration"></param>
public static void UseSession(this IServiceCollection services, SessoinConfig sessoinConfig)
{
    services.AddSingleton<IDistributedCache>(
        serviceProvider =>
            new RedisCache(new RedisCacheOptions
            {
                Configuration = sessoinConfig.RedisCacheConfig.ConnectionString,
                InstanceName = sessoinConfig.RedisCacheConfig.InstanceName
            }));
 
    // 添加Session并设置过期时长
    services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(sessoinConfig.SessionTimeOut); });
}

Startup服务添加容器方法ConfigureServices

1
2
3
4
// 读取Session配置文件
IConfigurationSection sessionCacheSections = Configuration.GetSection("SessoinConfig");
SessoinConfig sessionCacheConfig = sessionCacheSections.Get<SessoinConfig>();
services.UseSession(sessionCacheConfig);

Startup运行时方法Configure使用Session

1
2
// 使用Session
app.UseSession();

自定义Session扩展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/// <summary>
/// Session扩展
/// </summary>
public static class SessionExtensions
{
    /// <summary>
    /// 添加Session
    /// </summary>
    /// <param name="session"></param>
    /// <param name="key"></param>
    /// <param name="value"></param>
    public static void SetObjectAsJson(this ISession session, string key, object value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }
 
    /// <summary>
    /// 添加Session
    /// </summary>
    /// <param name="session"></param>
    /// <param name="key"></param>
    /// <param name="value"></param>
    public static void SetObjectAsJson<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }
 
    /// <summary>
    /// 获取Session
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="session"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static T GetObjectFromJson<T>(this ISession session, string key)
    {
        var value = session.GetString(key);
        return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
    }
 
    /// <summary>
    /// 删除Session
    /// </summary>
    /// <param name="session"></param>
    /// <param name="key"></param>
    public static void RemoveSession(this ISession session, string key)
    {
        var value = session.GetString(key);
        if (value != null)
        {
            session.Remove(key);
        }
    }
}

例如我存储登录验证码

1
2
3
4
5
6
7
8
/// <summary>
        /// 用户登录验证码
        /// </summary>
        protected string ValidateCodeData
        {
            get { return HttpContext.Session.GetObjectFromJson<string>(LoginValidateCodeSessionKey); }
            set { HttpContext.Session.SetObjectAsJson<string>(LoginValidateCodeSessionKey, value); }
        }
1
2
3
4
5
6
7
8
9
10
11
/// <summary>
        /// 获取验证码
        /// </summary>
        /// <returns></returns>
        public IActionResult ValidateCode()
        {
            System.IO.MemoryStream ms = _logic.LoginValidateCode(out string code, 4);
            ValidateCodeData = code;
            Response.Body.Dispose();
            return File(ms.ToArray(), @"image/png");
        }

技术分享图片

 

 欢迎转载,转载请保留出处,哈哈哈

.net core 3.0/3.1session持久化redis,session id为空

原文:https://www.cnblogs.com/lonelyxmas/p/12892421.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!