2014-10-31 56 views
0

我面臨的問題是靜態字典似乎被「response.redirect」命令清空了。ASP.NET:靜態字典在response.redirect後爲空

這裏是主要頁面的代碼:

public partial class Accueil : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { ... } 

    protected void _Connect_Click(object sender, EventArgs e) 
    { 
     PlayerDao.LogIn(_Pseudo.Text, _Password.Text, HttpContext.Current.Session.SessionID); 
     Response.Redirect("~/Game/Index.aspx", true); 
    } 
} 

登錄mehod提取物:

public static void LogIn(string pseudo, string password, string sessionId) 
{ 
    ... 
    Player.Dict.Add(sessionId, player); 
    ... 
} 

而且Player.Dict詞典:

public class Player 
{ 
    private static Dictionary<string, Player> dict = new Dictionary<string, Player>(); 
    public static Dictionary<string, Player> Dict 
    { 
     get { return dict; } 
     set { dict= value; } 
    } 

    ... 
} 

的Response.Redirect的前右,該字典仍包含在LogIn方法中添加的元素,但在Index.aspx Page_Load cod中e,它是空的。 如果有人有一個想法,請隨時,我一定犯了一個愚蠢的錯誤,但無法弄清楚。

謝謝!

+2

難道不是HTTP協議如何工作嗎?對ASP.NET不太熟悉,但除非在應用程序服務器上運行,否則跳過頁面後將丟失內存中的任何數據。 – 2014-10-31 15:26:33

+1

@RoyalBg是無視asp.net,這是它的工作原理。 OP需要某種持久性,如會話(如果是用戶)或數據庫(如果是全局的)。 – JonH 2014-10-31 15:33:18

回答

3

Flash_Back,請記住網絡是無狀態的。這意味着您的字典正在服務器的內存中創建。當您重定向到新頁面時,您的上下文就是新請求的上下文,因此字典已經消失。在新頁面的page_load事件中您可以訪問的唯一內容是您在page_load期間創建的內容,或者已存儲在Session或狀態數據庫中的內容。如果它是特定於單個用戶的信息,請使用Session。如果應該由應用程序的所有用戶共享(因爲它看起來像你的字典應該是),你需要將這些數據保存在數據庫中。

我正在回答單個Web服務器場景的情況。如果您的應用程序跨越多個Web服務器,會話將成爲此問題的一個錯誤解決方案在這種情況下,請使用數據庫。

+0

非常感謝您的回答Mike!我很新手,但我希望實現的目的是以某種方式存儲用戶會話,以便使用sessionId從數據庫獲取播放器對象。由於用靜態字典似乎不可能完成,它應該存儲在數據庫中,在一個表中關聯一個用戶ID和一個會話ID? – 2014-10-31 15:35:31

+0

對於你在做什麼,我會說是的,數據庫表是要走的路。如果您的應用程序尚未將其用於自己的數據,則需要考慮輕量級選項。我將MongoLab(MongoDB作爲服務)用於任何不會生成大量數據的Web應用程序。他們提供高達500MB的免費數據庫,並且您可以通過Nuget獲得C#驅動程序。安裝和使用起來非常簡單快捷(經過一段簡短的學習曲線),您將在工具包中找到新的工具。 – 2014-10-31 15:41:11

+0

我已經有一個網站的數據庫,但我不認爲爲用戶會話創建一個表實際上是正確的方式。但是,由於sessionId不會在用戶連接期間改變,所以聽起來相當不錯!非常感謝您的幫助,我會接受您的回答。 – 2014-10-31 15:45:38