Asp.net mvc Redis会话状态提供程序在会话放弃时不删除密钥
我正在使用此命令将会话状态存储在Azure Redis缓存中 NuGet将会话状态保存在Redis中,您可以将其作为CLASICAL inProc会话进行管理 当用户登录时,我会这样做:Asp.net mvc Redis会话状态提供程序在会话放弃时不删除密钥,asp.net-mvc,session,azure,redis,stackexchange.redis,Asp.net Mvc,Session,Azure,Redis,Stackexchange.redis,我正在使用此命令将会话状态存储在Azure Redis缓存中 NuGet将会话状态保存在Redis中,您可以将其作为CLASICAL inProc会话进行管理 当用户登录时,我会这样做: AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); Session.Add("key", "value"); 会话值在应用程序中始终可用。 如果您查看RE
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
Session.Add("key", "value");
会话值在应用程序中始终可用。
如果您查看REDIS缓存,您将看到这两个键snurztvlyl2jk5wnzstjikln_Internal
snurztvlyl2jk5wnzstjikln_Data
其中snurztvlyl2jk5wnzstjikln
是会话ID
当我注销时:
public ActionResult LogOff()
{
Session.Abandon();
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
用户注销,但如果我查看redis缓存,值将保持不变。它们不会被删除,只有在会话超时后才会被删除。我还尝试了Session.Clear()
,Redis缓存中的键仍然存在
为什么钥匙没有被删除,或者我做错了什么
更新我创建了一个公开回购,再现了该问题
我可以复制它。在Session.about()之后,所有内容都将从缓存中删除,但随后会调用ResetItemTimeout并更新内部密钥(*\u internal)。所以用户可以在Redis中看到内部密钥。但是我看不到Session.about()之后可用的*\数据,它包含实际的会话数据 我已经解决了这个与*_Internal相关的bug,并发布了一个新的nuget包。()
如果您仍然看到这个新版本的问题,请告诉我们 我联系了NuGet RedisessionStateProvider的创建者,他们向我解释了这是一种预期行为 他们说, 现在执行注销操作,该操作将调用“Session.about()”。这次手术 实际上从Redis中删除会话,但随后重定向到操作(“索引”, “Home”)导致调用“GetItemExclusive”(会话内的方法) 状态提供程序)尝试查找会话,但在中未找到会话 turn调用“CreateUninitializedItem”,该调用使用创建空会话 SessionStateActions设置为InitializeItem(或1)。所以在这一点上,如果 在本次会议上,您将看到关键的“SessionStateActions” 而不是“钥匙”。因为这是新创建的空会话,而不是 老的那个 这就是ASP.NET MVC的设计方式。你应该看到和你一样的行为 所有其他供应商也是如此。检查 ()用于 有关会话状态方法及其含义的更多详细信息
谢谢,使用这个最新的Nuget版本,问题依然存在。我将问题更新为github回购协议,复制了该问题。