前一段时间我们将生产转移到使用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>
答案 0 :(得分:1)