6

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

NuGet RedisSessionStateProvider将您的会话状态保存在 Redis 中,您可以像在 Proc 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

4

2 回答 2

6

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

他们说:

现在您执行注销,它调用“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 ) 了解有关会话状态方法及其含义的更多详细信息。

于 2015-01-06T19:46:00.033 回答
2

我有点能够复制它。在 Session.Abandon() 之后,所有内容都从缓存中删除,但随后调用 ResetItemTimeout 并更新内部密钥 (*_Internal)。所以用户在 Redis 中看到了内部键。但是在包含实际会话数据的 Session.Abandon() 之后,我看不到 *_Data 可用。

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

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

于 2015-01-05T19:47:38.797 回答