Redis 会话状态提供程序 - 设置操作区分大小写?
Redis Session State Provider - set operation case sensitive?
前段时间我们将生产转移到使用 Redis 缓存作为 ASP.NET 会话存储,我们注意到 Redis 会话提供程序处理会话键的方式有非常奇怪的行为。
我们在迁移后注意到的问题如下:Session["test"]
仍然包含通过 Session.Clear()
清除后的值,并且它肯定是特定于提供者的,因为故障返回到 InProc
会话存储解决了这个问题。
在底部您可以找到 Redis 状态,这是下面列出的代码的结果,它会在 Session 操作上产生意外行为,例如 Session.Clear()
,或简单的会话项检索;从定义上看,这种状态似乎是错误的,因为 Session State's keys are case insensitive.
一般问题:经过少量调查,我们意识到 Redis 会话提供程序将处理会话密钥以设置数据以区分大小写的方式 ,不像会话数据检索。因此,可以为任何字符串(长度为 n)创建最多 2^n
个不同大小写的键,并且它们将分开存储 , 导致其检索思想 Session 对象的未定义行为和特别是上述的奇怪行为。
如何到达那里: 创建 ASP.NET Web Forms 应用程序,添加 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>
前段时间我们将生产转移到使用 Redis 缓存作为 ASP.NET 会话存储,我们注意到 Redis 会话提供程序处理会话键的方式有非常奇怪的行为。
我们在迁移后注意到的问题如下:Session["test"]
仍然包含通过 Session.Clear()
清除后的值,并且它肯定是特定于提供者的,因为故障返回到 InProc
会话存储解决了这个问题。
在底部您可以找到 Redis 状态,这是下面列出的代码的结果,它会在 Session 操作上产生意外行为,例如 Session.Clear()
,或简单的会话项检索;从定义上看,这种状态似乎是错误的,因为 Session State's keys are case insensitive.
一般问题:经过少量调查,我们意识到 Redis 会话提供程序将处理会话密钥以设置数据以区分大小写的方式 ,不像会话数据检索。因此,可以为任何字符串(长度为 n)创建最多 2^n
个不同大小写的键,并且它们将分开存储 , 导致其检索思想 Session 对象的未定义行为和特别是上述的奇怪行为。
如何到达那里: 创建 ASP.NET Web Forms 应用程序,添加 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>