【问题标题】:ASP.CORE Session using a DistributedSqlServerCache使用 DistributedSqlServerCache 的 ASP.CORE 会话
【发布时间】:2019-09-06 21:41:21
【问题描述】:

我们使用DistributedSqlServerCache 来存储用户会话数据,但我注意到一些意外/奇怪的行为。所以我想知道DistributedSqlServerCache 如何在幕后工作以帮助我理解我所看到的行为。

当用户到达站点时,会立即插入一个 DB 条目,如下图 1 所示。

当用户注销或会话超时时,会话数据被清除(替换为任意默认值)并且 ExpiresAtTime 也被重置,如下图 2 所示。

再次,另一个用户到达该站点,并插入了一个新的 DB 条目,如下图 3 所示。

但是这一次,如果应用程序池被回收或者IIS被重置,那么下面(img 4)就是数据库中的结果:

原来的会话似乎没有被清空,新的会话也开始了。

为了完整起见,下面是我们在 StartUp.cs 中使用的代码:

services.AddDistributedSqlServerCache(o =>
{
    o.ConnectionString = "conn_string...";
    o.SchemaName = "dbo";
    o.TableName = "PS_PWD_SESSIONS";
});

services.AddSession();

除非我用错了方法,否则这对我来说毫无意义。如果能对此行为有任何见解,我将不胜感激。

【问题讨论】:

  • 你为iis设置了机器密钥吗?
  • 我相信这些都设置好了。

标签: c# asp.net-core session-state


【解决方案1】:

最好不要太担心这个。 ASP.NET Core 知道它在做什么。我认为您看到的行为是会话密钥与会话 ID 的结果。会话 ID 与实际的物理会话相关联,并在此处持久保存在数据库中。但是,发送给用户的 cookie 只包含一个会话 key。此会话密钥始终有效且永不过期。然后客户端总是用相同的会话密钥发回这个 cookie,ASP.NET Core 在内部根据会话是否过期等来决定是恢复之前的会话还是创建一个新的会话。

换句话说,实际数据库中的基础数据不一定反映现有的“会话”,至少从客户端的角度来看是这样。对于客户来说,他们的会话永远存在,但在数据库中它可以被删除。如果数据库中没有与客户端会话密钥对应的活动会话,则 ASP.NET Core 只会创建一个新会话。

【讨论】:

  • 谢谢克里斯。那么只有一件事:这不会导致数据库中出现大量冗余数据吗?如果我使用内存缓存会怎样……这会导致某种内存泄漏吗?
  • 没有。如果有的话,您的数据库中的会话数据将少于具有会话密钥的实际客户端。对于单个会话密钥,这不是重复会话;它是多个会话密钥。就内存缓存而言:1)不要使用分布式内存缓存。它仅作为默认提供程序存在,主要用于开发。它实际上并没有分发。像所有内存缓存一样,它是进程绑定的。 2)内存缓存是低优先级的,当内存不足时可以驱逐键。这不是内存泄漏,因为在这种情况下内存无法回收。
猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 2019-06-17
  • 1970-01-01
  • 2019-02-16
  • 2019-10-28
相关资源
最近更新 更多