2014-10-31 75 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