窥探ASP.NET CORE 将Session持久化到Redis,以及Redis和其他安包冲突StackExchange.Redis.StrongName与StackExchange.Redis冲突


最近在做项目,要求实现分布式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");

在此步骤,我遇到一个坑,稍等,容我重现这个让人美丽且邪恶的问题。
avatar


原因是这样的,在加入Session持久化到Redis之前,项目Common层已有对StackExchange.Redis的引用了,那么此时ui层因业务需要,会引用Common,此时ui层需要添加对Session key 持久化到Redis的支持,就涉及到StackExchange.Redis.StrongName,此时就会和Common层StackExchange.Redis相冲突。
解决措施:将原有的StackExchange.Redis更换为强命名的StackExchange.Redis.StrongName即可。

效果图:

avatar

欢迎加入.NET CORE/ASP.NET CORE 技术交流群,我们期待你的加入。
群号:702566187

你可能感兴趣的:(ASP.NET,Core)