Redis会话状态提供程序 - 设置操作区分大小写?

时间:2015-10-05 18:25:35

标签: c# asp.net webforms redis stackexchange.redis

前一段时间我们将生产转移到使用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窗体应用程序,添加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 state

1 个答案:

答案 0 :(得分:1)