2013-05-27 28 views
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) { 
} 

上面的代碼做在頁面負載2米的東西。首先,將一個字符串「Hello World」分配給會話變量test。第二,將0到99之間的整數寫入不同行的文本文件「sample.txt」中。 點擊btnSubmit會觸發一個回傳(按鈕不會做任何其他事情,只是爲了回發頁面)。回傳後,價值sessionCount = 1test = "Hello World"。這是預期的行爲,上面的代碼運行良好。

現在,如果你改變n = 9000或任何大的整數,在回發(通過點擊btnSubmit),會話變量Session["test"]爲空和sessionCount = 0test引發異常,因爲Session["test"]不存在。是什麼賦予了?我的開發機器有6GB的內存,內存不足是不可能的,因爲處理成千上萬的整數並不需要太多。

+0

如果你把一個破發點的9000時間循環它擊中後?也許它會因爲要求寫同一個文件9000次而中斷?我敢打賭,如果你用using語句包裝了for循環,我會感興趣的,儘管 –

+0

寫入文本文件運行良好,但我有興趣知道它爲什麼不起作用。用預期內容生成的文本文件。空的異常僅在'string test = Session [「test」]時被拋出。ToString();' –

+0

有趣的,我會繼續關注爲什麼會這樣,你是否試圖在for語句中包裝for循環,只是爲了看看這是不是原因 –

回答

0

我想你會存儲你的會話inProc。

發生什麼事與StreamWriter無關。編譯代碼時應用程序將重新啓動,並且會丟失會話。值Session [「test」]消失了。這是流程:

  1. 加載頁面(你知道保存的「Hello World」中的會話)
  2. 單擊按鈕(正常工作,也不例外)
  3. 更新代碼和編譯(應用重新啓動你的會話丟失)
  4. 點擊提交按鈕(Page.IsPostBack爲true)
  5. 您執行Session["test"].ToString()但你一步後沒有執行Session["test"] = "Hello World" 3.

如果您在web.config中從inProc更改爲StateServer並啓動會話狀態服務,那麼您將不會收到空引用錯誤。

+0

這聽起來像是一種可能的情景,並且如果您不重新啓動每個事情,都很容易測試。只需再次嘗試n = 10 –

+0

每次我重新編譯我的代碼時,我都會確保首先刷新頁面。我已經驗證過,對於每次重新編譯,在頁面刷新後將再次執行'Session [「test」] =「Hello World」'。 –

+0

您是通過按F5還是轉到地址欄並按Enter鍵來刷新頁面?如果你在頁面上做的最後一件事是帖子,那麼F5會做另一個帖子,你會再次得到異常。 – user707727