【问题标题】:ASP.NET: Static dictionary empty after response.redirectASP.NET:response.redirect 后静态字典为空
【发布时间】:2014-10-31 15:23:00
【问题描述】:

我遇到了一个关于静态字典的问题,该字典似乎被“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);
    }
}

登录方法摘录:

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 代码中,它是空的。 如果有人有想法,请随意,我一定犯了一个愚蠢的错误,但无法弄清楚。

谢谢!

【问题讨论】:

  • 这不就是 HTTP 协议的工作原理吗?对ASP.NET不太熟悉,但是除非你在应用服务器上运行,否则你会在页面跳转后丢失内存中的任何数据。
  • @RoyalBg 是的,不管 asp.net 是什么,它都是这样工作的。 OP 需要某种持久性,例如会话(如果它针对用户)或数据库(如果它是全局的)。

标签: c# asp.net dictionary response.redirect


【解决方案1】:

Flash_Back,请记住,网络是无状态的。这意味着您的字典正在服务器上的内存中创建。当您重定向到新页面时,您的上下文是新请求的上下文,因此字典消失了。您可以在新页面的 page_load 事件期间访问的唯一内容是您在 page_load 期间创建的内容,或者已存储在 Session 或状态数据库中的内容。如果它是特定于单个用户的信息,请使用 Session。如果它是应用程序的所有用户共享的东西(就像您的字典一样),您需要将该数据持久化,可能在数据库中。

我在单个 Web 服务器场景的上下文中回答。当您的应用程序跨越多个 Web 服务器时,Session 成为解决此问题的糟糕方法。在这种情况下,请使用数据库。

【讨论】:

  • 非常感谢您的回答,迈克!我很新手,但我想要实现的目标是以某种方式存储用户会话,以便使用 sessionId 从数据库中获取播放器对象。由于使用静态字典似乎不可能完成,因此是否应该将其存储在数据库中,在将用户 ID 和会话 ID 相关联的表中?
  • 对于你正在做的事情,我会说是的,数据库表是要走的路。如果您的应用程序尚未将其用于自己的数据,则可以考虑使用轻量级选项。我将 MongoLab(MongoDB 即服务)用于任何不会生成大量数据的 Web 应用程序。他们提供高达 500MB 的免费数据库,并且您可以通过 Nuget 获得一个 C# 驱动程序。它的设置和使用既快速又简单(经过短暂的学习曲线),您的套件中有一个新工具可供将来使用。
  • 我已经有一个网站数据库,但我认为为用户会话创建表实际上不是正确的方法。但是,由于 sessionId 并不意味着在用户连接期间更改,所以听起来还是不错的!非常感谢您的帮助,我会接受您的回答。
  • 如果我可以问最后一件事,创建一个表意味着将在每个 Page_Load 中发送一个请求,以获取与 sessionId 相关的播放器。大量用户同时连接会不会很慢?
  • 是的,当然可以,这取决于您所说的“很多”。要减少不必要的数据库流量,您可以检索该值并将其存储在 Session 中。然后在每个 page_load 事件期间检查该值是否在会话中。如果没有,请调用数据库以检索它(并将其存储以供下次调用)。
猜你喜欢
  • 2010-10-15
  • 2014-12-25
  • 1970-01-01
  • 2020-03-30
  • 1970-01-01
  • 2012-09-16
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多