2015-10-05 44 views
0

前段时间,我们将产品移至使用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> 

Redis state

+1

我运行了你的代码,但是我找不到任何错误,Session [“test”]与Session [“Test”]相同,当我调用Session.Clear()时,这些值都消失了。但我确实注意到Redis内部的2个哈希子键Test和Test,并且至少有一个性能问题(可以创建太多的子键)。该项目现在在github上开源 - 尝试在那里打开一个问题:https://github.com/Azure/aspnet-redis-providers –

+0

@LiviuCostea,Session [“test”]与Session [“Test” ] - 这也是我注意到的,Get操作看起来不区分大小写,但Set操作不是。当我设置“测试”键 - 然后,在下一次请求会尝试使用会话[“测试”]获得价值,我会收到我以前使用“测试”键设置的值 - 这绝对不是预期的并且不匹配InProc提供者行为。我会按照你的建议提交一个错误。谢谢! –

+0

@LiviuCostea,我在那里提交了一个错误,并添加了截屏视频,以显示问题 –

回答