2015-10-05 36 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,我在那裏提交了一個錯誤,並添加了截屏視頻,以顯示問題 –

回答

相關問題