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

Ric*_*olo 4 asp.net-mvc session azure redis stackexchange.redis

我使用此过程将会话状态存储在Azure Redis缓存中.

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

当用户登录我做这样的事情:

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

会话值在应用程序中始终可用.如果您查看REDIS缓存,您将看到这两个密钥snurztvlyl2jk5wnzstjikln_Internal snurztvlyl2jk5wnzstjikln_Data在哪里 snurztvlyl2jk5wnzstjikln是SessionID.

当我退出时:

public ActionResult LogOff()
{
Session.Abandon();
AuthenticationManager.SignOut();
return RedirectToAction("Index", "Home");
}
Run Code Online (Sandbox Code Playgroud)

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

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

更新我创建一个公共repo再现此问题 https://github.com/ricardopolo/RedisIssue

Ric*_*olo 5

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

他们说:

现在执行Logout调用"Session.Abandon()".此操作实际上从Redis中删除了会话,但随后RedirectToAction("Index","Home")导致调用"GetItemExclusive"(会话状态提供程序中的一个方法),它尝试查找会话但未找到,因此它依次调用"CreateUninitializedItem" "它创建空会话,SessionStateActions设置为InitializeItem(或1).所以此时如果你在这个会话上做HGETALL,你会看到关键的"SessionStateActions"而不是"Key".因为这是新创建的空会话而不是旧会话.

这就是ASP.NET MVC的设计方式.您应该看到与所有其他提供程序相同的行为.有关会话状态方法及其含义的更多详细信息,请查看(http://msdn.microsoft.com/en-us/library/ms178587(v=vs.140).aspx).