ASP.CORE 使用 DistributedSqlServerCache 的会话
ASP.CORE Session using a DistributedSqlServerCache
我们使用 DistributedSqlServerCache
来存储用户会话数据,但我注意到一些 unexpected/strange 行为。所以我想知道 DistributedSqlServerCache
如何在幕后工作以帮助我理解我所看到的行为。
当用户到达站点时,会立即插入一个数据库条目,如下图 1 所示。
当用户注销或会话超时时,会话数据被清除(替换为任意默认值)并且 ExpiresAtTime 也被重置,如下图 2 所示。
再次,另一个用户到达该站点,并插入一个新的数据库条目,如下图 3 所示。
但是这一次,如果应用程序池被回收或者IIS被重置,那么下面(img 4)是数据库中的结果:
看来原来的session还没有清空,又开启了新的session
为了完整起见,这是我们在 StartUp.cs 中使用的代码:
services.AddDistributedSqlServerCache(o =>
{
o.ConnectionString = "conn_string...";
o.SchemaName = "dbo";
o.TableName = "PS_PWD_SESSIONS";
});
services.AddSession();
除非我的想法不对,否则这对我来说没有意义。如果能深入了解此行为,我将不胜感激。
最好不要太担心这个。 ASP.NET Core 知道它在做什么。我认为您看到的行为是会话密钥与会话 ID 的结果。会话 ID 与实际的物理会话相关联,保存在此处的数据库中。但是,发送给用户的 cookie 只包含一个会话 key。此会话密钥始终有效且永不过期。然后客户端总是用相同的会话密钥发回这个 cookie,ASP.NET Core 在内部根据会话是否已过期等因素决定是恢复以前的会话还是创建一个新会话
换句话说,实际数据库中的基础数据不一定反映现有 "sessions",至少从客户的角度来看是这样。对于客户来说,他们的会话永远存在,但在数据库中它可以被删除。如果数据库中没有与客户端会话密钥相对应的活动会话,那么 ASP.NET Core 只会创建一个新会话。
我们使用 DistributedSqlServerCache
来存储用户会话数据,但我注意到一些 unexpected/strange 行为。所以我想知道 DistributedSqlServerCache
如何在幕后工作以帮助我理解我所看到的行为。
当用户到达站点时,会立即插入一个数据库条目,如下图 1 所示。
当用户注销或会话超时时,会话数据被清除(替换为任意默认值)并且 ExpiresAtTime 也被重置,如下图 2 所示。
再次,另一个用户到达该站点,并插入一个新的数据库条目,如下图 3 所示。
但是这一次,如果应用程序池被回收或者IIS被重置,那么下面(img 4)是数据库中的结果:
看来原来的session还没有清空,又开启了新的session
为了完整起见,这是我们在 StartUp.cs 中使用的代码:
services.AddDistributedSqlServerCache(o =>
{
o.ConnectionString = "conn_string...";
o.SchemaName = "dbo";
o.TableName = "PS_PWD_SESSIONS";
});
services.AddSession();
除非我的想法不对,否则这对我来说没有意义。如果能深入了解此行为,我将不胜感激。
最好不要太担心这个。 ASP.NET Core 知道它在做什么。我认为您看到的行为是会话密钥与会话 ID 的结果。会话 ID 与实际的物理会话相关联,保存在此处的数据库中。但是,发送给用户的 cookie 只包含一个会话 key。此会话密钥始终有效且永不过期。然后客户端总是用相同的会话密钥发回这个 cookie,ASP.NET Core 在内部根据会话是否已过期等因素决定是恢复以前的会话还是创建一个新会话
换句话说,实际数据库中的基础数据不一定反映现有 "sessions",至少从客户的角度来看是这样。对于客户来说,他们的会话永远存在,但在数据库中它可以被删除。如果数据库中没有与客户端会话密钥相对应的活动会话,那么 ASP.NET Core 只会创建一个新会话。