【问题标题】:Session variable doesn't persist upon postback (out of memory perhaps?)回发时会话变量不会持续存在(可能是内存不足?)
【发布时间】:2013-05-22 08:36:53
【问题描述】:

我在一个更大的项目中遇到了这个问题,我设法在一个缩小的单页场景中查明并重现了它。该页面有一个单按钮控件btnSubmit,后面的代码如下:

private int n = 100;

protected void Page_Init(object sender, EventArgs e) {
    btnSubmit.Click += btnSubmit_Click;
}

protected void Page_Load(object sender, EventArgs e) {
    if (!Page.IsPostBack) {
        Session["test"] = "Hello World";

        for (int i = 0; i < n; i++) {
            using (StreamWriter file = new StreamWriter(Server.MapPath("/sample.txt"), true)) {
                file.WriteLine(i);
            }
        }
    } else {
        int sessionCount = Session.Count;
        string test = Session["test"].ToString();
    }
}

void btnSubmit_Click(object sender, EventArgs e) {
}

上面的代码在页面加载时做了两件事。首先,将字符串“Hello World”分配给会话变量test。第二,将 0 到 99 的整数写入文本文件“sample.txt”的不同行。 单击btnSubmit 会触发回发(该按钮不执行任何其他操作,只是回发页面)。回发后,sessionCount = 1test = "Hello World" 的值。这是预期的行为,上面的代码运行良好。

现在,如果您更改n = 9000 或任何大整数,在回发时(通过单击btnSubmit),会话变量Session["test"] 为空且sessionCount = 0test 抛出异常,因为 Session["test"] 不存在。是什么赋予了?我的开发机器有 6GB 的 RAM,内存不足不太可能是原因,因为处理几千个整数并不需要太多。

【问题讨论】:

  • 如果你在 9000 次循环之后放置一个断点,它会命中吗?也许它会因为要求写入同一个文件 9000 次而被中断?我敢打赌,如果你用 using 语句包装 for 循环,它会起作用,我很想知道为什么它不能按原样工作
  • 写入文本文件运行良好。使用预期内容生成的文本文件。空异常仅在 string test = Session["test"].ToString(); 处引发
  • 有趣,我会继续关注这是为什么,您是否尝试将 for 循环包装在单个 using 语句中,看看是否是原因

标签: c# asp.net postback session-variables


【解决方案1】:

【讨论】:

    【解决方案2】:

    我猜你将会话存储在 Proc 中。

    发生的事情与 StreamWriter 无关。当您编译代码时,应用程序将重新启动,您将失去会话。值 Session["test"] 消失了。这是流程:

    1. 加载页面(你知道在会话中保存“Hello World”)
    2. 点击按钮(效果很好,无异常)
    3. 更新代码并编译(应用程序重新启动,您的会话丢失)
    4. 点击提交按钮(Page.IsPostBack为真)
    5. 您执行了Session["test"].ToString(),但在第3步之后您还没有执行Session["test"] = "Hello World"

    如果将web.config中的inProc改为StateServer,并启动会话状态服务,则不会出现空引用错误。

    【讨论】:

    • 这听起来像是一个可能的场景,并且如果您不是每次都重新启动,那么很容易测试。再试一次 n = 10
    • 每次我重新编译我的代码时,我都会确保先刷新页面。我已经验证,每次重新编译,Session["test"] = "Hello World"会在页面刷新后再次执行。
    • 您是通过按 F5 还是通过转到地址栏并按 Enter 来刷新页面?如果你在页面上做的最后一件事是发帖,那么 F5 会再发一个帖子,你会再次收到异常。
    • 我确定这不是帖子。要么是我在按 F5 之前按下了浏览器的后退按钮,要么是在地址栏获得焦点时按 Enter。
    • 嗯...这很奇怪。我没有设法重现该问题。如果我在编译后直接发布帖子,我只会得到转储,而不是在加载页面然后发布帖子之后。我设置 n = 100000;
    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 2018-07-25
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多