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>

这已在 https://www.nuget.org/packages/Microsoft.Web.RedisSessionStateProvider/2.2.1 中修复。感谢您报告问题。