最近在做项目,要求实现分布式Session,想着将Session持久化到Redis,简单明了,一把梭。在实现的过程中,将Session Value持久化到Redis挺顺利的,在将SessionId持久化到Redis就出了点岔子。
1、首先在Startup的ConfigureServices中添加Redis和Session的支持。
public void ConfigureServices(IServiceCollection services)
{
//添加对redis的支持
services.AddDistributedRedisCache(options =>
{
options.Configuration = "localhost";//你的redis 地址
//session value 持久化到redis路径
options.InstanceName = "yourProject:Admin:Session:Value:";
});
//添加session的支持
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(5); //session过期时间
options.Cookie.HttpOnly = true;
});
services.AddMvc();
}
2、在Startup的Configure中,添加Session中间件。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
//添加Session中间件
app.UseSession();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
此时,Session的值已经可以储存到Redis了,可是分布式环境下,通过负载均衡,Session可能会有诸多不确定性因素,因此把SessionId也储存到Redis会比较稳妥。如果无需考虑SessionId持久化到Redis,则无需实现3点。
3、将SessionId 持久化到Redis,在Startup的Configure中,添加如下代码。
需要安装:
Nuget: Microsoft.AspNetCore.DataProtection.Redis
var redis = StackExchange.Redis.ConnectionMultiplexer.Connect("");
services.AddDataProtection().PersistKeysToRedis(redis, "yourProject:Admin:Session:SessionId");
在此步骤,我遇到一个坑,稍等,容我重现这个让人美丽且邪恶的问题。
原因是这样的,在加入Session持久化到Redis之前,项目Common层已有对StackExchange.Redis的引用了,那么此时ui层因业务需要,会引用Common,此时ui层需要添加对Session key 持久化到Redis的支持,就涉及到StackExchange.Redis.StrongName,此时就会和Common层StackExchange.Redis相冲突。
解决措施:将原有的StackExchange.Redis更换为强命名的StackExchange.Redis.StrongName即可。
效果图:
欢迎加入.NET CORE/ASP.NET CORE 技术交流群,我们期待你的加入。
群号:702566187