Redis会话状态提供程序不会删除会话放弃上的键

时间:2014-12-26 04:23:01

标签: asp.net-mvc session azure redis stackexchange.redis

我使用此procedure将会话状态存储在Azure Redis缓存中。

NuGet RedisSessionStateProvider在Redis中保存会话状态,您可以管理它,因为它是clasiccal inProc Session。

当用户登录时,我会这样做:

AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
Session.Add("key", "value");

会话值在应用程序中始终可用。 如果你查看REDIS缓存,你会看到这两个密钥snurztvlyl2jk5wnzstjikln_Internal snurztvlyl2jk5wnzstjikln_Data,其中snurztvlyl2jk5wnzstjikln是SessionID。

当我退出时:

public ActionResult LogOff()
{
Session.Abandon();
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}

用户SignOut,但如果我查看redis缓存,则值仍然存在。它们不会被删除,只会在会话超时后删除。我也试过Session.Clear(),Redis缓存中的密钥仍然存在。

为什么不删除密钥或我做错了什么?

更新我创建了一个重现此问题的公共回购 https://github.com/ricardopolo/RedisIssue

2 个答案:

答案 0 :(得分:5)

我联系了NuGet RedisSessionStateProvider的创建者,他们向我解释了它的预期行为。

他们说:

  

现在执行Logout调用“Session.Abandon()”。这个操作   实际上从Redis删除会话,然后RedirectToAction(“索引”,   “Home”)导致调用“GetItemExclusive”(会话内的方法)   尝试查找会话但未找到会话的状态提供者)   转动调用“CreateUninitializedItem”,创建空会话   SessionStateActions设置为InitializeItem(或1)。所以在这一点上   你在这个会话上做HGETALL,你会看到关键的“SessionStateActions”   而不是“钥匙”。因为这是新创建的空会话而不是   旧的。

     

这就是ASP.NET MVC的设计方式。您应该看到相同的行为   所有其他供应商也是如此。校验   (http://msdn.microsoft.com/en-us/library/ms178587(v=vs.140).aspx)for   有关会话状态方法及其含义的更多详细信息。

答案 1 :(得分:2)

我有点能够重现它。在Session.Abandon()之后,所有内容都从缓存中删除,然后调用ResetItemTimeout并更新内部密钥(* _Internal)。因此用户在Redis中看到内部密钥。但是在Session.Abandon()之后我没有看到* _Data可用,其中包含实际的会话数据。

我已经解决了与* _Internal相关的这个bug并发布了一个新的nuget包。 (https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/1.3.0

如果您仍然看到此新版本的问题,请告诉我们。