参考一:https://www.cnblogs.com/vipyoumay/p/7771237.html
参考二:https://www.cnblogs.com/stulzq/p/7729105.html
背景:原本使用cookie存储登录信息,使用nginx的ip_hash勉强解决多服务器问题,但是现在为了上k8s,因此使用docker,所以ip_hash没了,所以cooker方式pass掉了
过程:经过一系列baidu操作,最终觉得尝试使用 Redis 来存储 Session,以解决以上问题
总体分为两个步骤
一、存储登录信息到redis
1、添加 Microsoft.Extensions.Caching.Redis
2、在Startup.cs中添加配置
//添加redis配置 services.AddDistributedRedisCache(option => { //redis 连接字符串 option.Configuration = address; //redis 实例名 option.InstanceName = Configuration["InstanceName"]; }); //添加session配置 services.AddSession(options => { //session存活时间 options.IdleTimeout = TimeSpan.FromHours(Convert.ToDouble(Configuration["SessionTimeOut"])); //设为httponly options.Cookie.HttpOnly = true; });
//启用session
app.UseSession();
3、使用用session
//存 HttpContext.Session.SetString("UserId", user.UserId); //取 string UserId = HttpContext.Session.GetString("UserId") //清除() HttpContext.Session.Clear();
二、存储sessionid到redis
1、添加 ServiceStack.Redis.Core
2、添加配置
//添加数据保护(把sessionid存储到redis) services.AddDataProtection() .SetApplicationName("session_redis_application_name") .PersistKeysToStackExchangeRedis(Helper.getSessionConfig("address"), "DataProtection-Keys");
/// <summary> /// 获取session配置 /// </summary> /// <param name="address"></param> /// <returns></returns> public static StackExchange.Redis.ConnectionMultiplexer getSessionConfig(string address) { var redis = StackExchange.Redis.ConnectionMultiplexer.Connect(address); return redis; }
注意:这里有一个坑,ConnectionMultiplexer需要引用的命名空间有冲突,网上有说改名字能解决,但是我尝试失败了,也许是我的方式不对
我的项目是多层项目,所以我就把【获取session配置】放到Commin类库中,就解决了这个冲突
亲测有效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)