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
我联系了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).
| 归档时间: |
|
| 查看次数: |
2313 次 |
| 最近记录: |