前段时间,我们将产品移至使用Redis Cache作为ASP.NET会话存储,并且我们注意到Redis Session提供程序处理会话密钥的情况下非常奇怪的行为。Redis会话状态提供程序 - 设置操作是否区分大小写?
迁移以下之后,我们注意到的问题:Session["test"]
仍然包含通过Session.Clear()
被清除后的值,它是defenitely提供者特有的,因为故障回复到InProc
会话存储解决这个问题。
在底部可以找到Redis状态,这是下面列出的代码的结果,它会在会话(例如Session.Clear()
)或简单会话项目检索等操作上产生意外行为;这种状态根据定义似乎是错误的,因为Session State's keys are case insensitive。
问题一般:小调查后,我们意识到,Redis的会议提供商将处理会话密钥来设置区分大小写的方式数据,与会话数据检索。所以它有可能创建高达2^n
对于任何字符串(长度为n)不同的套接字密钥,他们将分别存储,导致其检索思想的未定义行为会话对象和奇怪的行为,如上特别。
如何到达:创建ASP.NET Web窗体应用程序,添加Microsoft.Web.RedisSessionStateProvider NuGet包(最新截至目前为1.6.5)。此外,我正在使用Azure Redis实例(PaaS)。
附上测试页的完整代码。
以下是截屏视频演示问题:http://screencast.com/t/aCuqqVau。
问题:这是按设计还是在那里有一个错误?
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="SessionIssue.Test" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server" />
<body>
<script runat=server>
protected void Step1_Click(object sender, EventArgs e)
{
Session["Test"] = "Y";
}
protected void Step2_Click(object sender, EventArgs e)
{
Session["test"] = "X";
}
protected void Clear_Click(object sender, EventArgs e)
{
Session.Clear();
}
protected override void OnPreRender(EventArgs e)
{
lbTest.Text = string.Format("{0}", Session["test"]);
}
</script>
<form id="form1" runat="server">
<div>
Session["test"]=<asp:Label ID="lbTest" runat="server" />
<br />
<asp:Button ID="btStep1" runat="server" Text="Step1" OnClick="Step1_Click" />
<asp:Button ID="btStep2" runat="server" Text="Step2" OnClick="Step2_Click" />
<asp:Button ID="btClear" runat="server" Text="Clear" OnClick="Clear_Click" />
</div>
</form>
</body>
</html>
我运行了你的代码,但是我找不到任何错误,Session [“test”]与Session [“Test”]相同,当我调用Session.Clear()时,这些值都消失了。但我确实注意到Redis内部的2个哈希子键Test和Test,并且至少有一个性能问题(可以创建太多的子键)。该项目现在在github上开源 - 尝试在那里打开一个问题:https://github.com/Azure/aspnet-redis-providers –
@LiviuCostea,Session [“test”]与Session [“Test” ] - 这也是我注意到的,Get操作看起来不区分大小写,但Set操作不是。当我设置“测试”键 - 然后,在下一次请求会尝试使用会话[“测试”]获得价值,我会收到我以前使用“测试”键设置的值 - 这绝对不是预期的并且不匹配InProc提供者行为。我会按照你的建议提交一个错误。谢谢! –
@LiviuCostea,我在那里提交了一个错误,并添加了截屏视频,以显示问题 –