3

我在一个更大的项目中遇到了这个问题,我设法在一个缩小的单页场景中查明并重现了它。该页面有一个单按钮控件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 = 1和的值test = "Hello World"。这是预期的行为,上面的代码运行良好。

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

4

2 回答 2

0

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

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

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

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

于 2013-05-27T13:39:18.290 回答
0

您可以尝试关闭对象跟踪。

来源:http: //msdn.microsoft.com/en-us/library/system.data.linq.datacontext.objecttrackingenabled.aspx

于 2013-05-27T13:41:47.187 回答