在Docker群中丢失的ASP.NET Core会话

时间:2018-09-09 09:55:09

标签: docker asp.net-core

我正在将ASP.NET Core应用程序转换为在Docker堆栈中运行。我目前已将其配置为在Web层使用5个复制的容器,所有这些容器都连接到一个MySQL容器。除了我每隔几页就会不断退出该网站外,该网站似乎运行良好,可能是因为我遇到的工作节点与登录的节点不同。我在查找有关如何使用数据库来保留登录会话的在线资源时遇到了麻烦,因为似乎它们被保留在内存中了。

我对这是为什么发生的诊断正确吗?如果是这样,有什么解决方案?

1 个答案:

答案 0 :(得分:0)

我最终不得不再次访问此问题,对没有答案感到失望,但最终我解决了该问题。我已经尝试使用Microsoft.Extensions.Caching.Redis设置基于Redis的分布式缓存:

// Persist session to distributed cache
services.AddDistributedRedisCache(options => {
    options.Configuration = this.Configuration.GetConnectionString("Redis");
    options.InstanceName  = "RedisCache";
});

但是,只要客户端在节点之间反弹,会话仍然会丢失。我最终发现,即使会话一直保留到Redis,用于加密会话令牌的数据保护密钥也存储在内存中,这意味着它们在容器更新时都会丢失。我用Microsoft.AspNetCore.DataProtection.Redis解决了这个问题。遗憾的是,此软件包没有“发布”版本,但有一个预发布版本:Install-Package Microsoft.AspNetCore.DataProtection.Redis -Version 2.2.0-preview2-35157

然后我将其设置为这样:

var redisConnection = this.Configuration.GetConnectionString("Redis");
var redis = ConnectionMultiplexer.Connect(redisConnection);

// Persist data protection keys to distributed cache
services.AddDataProtection()
        .PersistKeysToRedis(redis, "DataProtection-Keys");

// Persist session to distributed cache
services.AddDistributedRedisCache(options => {
    options.Configuration = redisConnection;
    options.InstanceName  = "RedisCache";
});

最后一步是绝对关键,以便跨服务器会话正常运行。希望这可以帮助其他人!