8

我在ASP.NET 2.0上遇到了一個非常奇怪的問題。我正在使用的系統使用會話變量來存儲參數(如問題和答案)以生成報告。這些是具有相同名稱的類的實例,因此它們使用如下參數進行填充:ASP.NET會話意外終止

此報告通過4個aspx頁面生成。首先定義位置和日期參數,第二頁存儲問題,第三存儲回答。最後的顯示鏈接到Excel和HTML格式的生成報告。 所有變量數據都存儲在會話中,並且一切都很順利,直到最後一頁時,如Session.Abandon()發生,Session_End事件被觸發並且所有變量都丟失。這種情況每天只發生一次,對於每個記錄的用戶首次使用報告,然後您可以嘗試整整幾十次,而不會再看到它。

問題發生在同一頁面總是,會話模式是InProc。

我已經做了以下驗證:

  1. 經過,如果有任何Session.Abandon()或Session.Clear()命令。沒有了。
  2. 檢查會話超時時間設置爲18分鐘,問題隨時發生,無論您在18分鐘內使用了多長時間。
  3. 選中的表單超時,在認證下。它也被設置爲18分鐘。
  4. 據我瞭解,有一個與Server.Transfer的(),它有時可能會刷新視圖狀態和,並與Response.Redirec()
  5. 監測了由行代碼會行了,一切順利的話換成了一個bug,當頁面完全加載時,它就會死亡。所有變量都消失了,但會話仍在工作。
  6. 就我而言,IIS已正確配置。我無法訪問它,但所有其他系統都能正常工作。
  7. 也分析了一些上述系統,尋找可能發生的事情的一些線索,但他們的web.config文件與我遇到的問題非常相似,沒有實現與會話交互的特殊代碼不同。
  8. 也想過監視IIS的應用程序重新啓動,但我敢肯定,它不超過默認限制15.儘管如此,我沒有訪問IIS服務器,並在我的計算機上完成的所有測試使用ASP。 NET開發服務器。這兩個問題都會發生。
  9. 已檢查過程回收的可能性,如.config和asax文件更改,更改/ bin目錄,都不會發生。

以下限制:

  1. 不能改變會議模式比InProc方式另因公司政策。
  2. 報告生成「過程」是通過4頁創建的。我不同意這一點,但由於時間和預算的限制,無法重做。

任何想法或解決方案都很有幫助。我會保持聯繫的任何更新和必要的測試。

+0

您是否有權訪問探查器機制?當專用於w3wp的內存量超過machine.config中指定的內存量時,我們遇到了會話刷新問題。 ASP.NET性能計數器幫助我們調試了很多。 –

+0

我們不使用machine.config文件。據我所知,這個文件是廣泛的網站,並會影響IIS上同一網站下的其他應用程序。公司的服務器基礎架構將同一網站下的所有系統應用於虛擬目錄。 –

+0

你可以發佈代碼來顯示session_end在什麼時候被觸發嗎?你用什麼來生成報告?檢查你是否意外地默默地處理任何異常(例如在application_error中)。 (如果報告的內容是第三方運行該頁面而沒有看到它是否仍然存在)。 – Jeroen

回答

2

我想感謝大家的努力!

我和我的團隊發現了這起案件正在發生的事情。有一種方法是刪除網站文件夾中的臨時文件和目錄,導致回收和會話刷新。代碼正在計算日期和時間,並且應該每24小時刪除一次,所以當用戶首次登錄到系統並生成報告時,它會刪除目錄並刷新會話。

1

一對夫婦的建議:

  1. 調試先打本地,看看是否有什麼路徑中是獨一無二的。
  2. 確保先打不會導致與工作進程的問題
  3. 確保您不使用會話值回發前

我認爲正在發生的是#3。您正在設置會話中的值,然後在實際存儲會話值的回發之前將其從會話中消耗回來。由於它只是在第一次嘗試中發生,症狀反映了這種懷疑。如果我是正確的,你可以通過從使用會話值的相同位置消耗而不是設置會話來解決此問題,然後嘗試從同一請求中獲取該值。

+0

至於#1,我已經表演過,但沒有看到任何「獨特」的東西。在#2上,我不太確定如何看到過程中的問題。對於#3,你的意思是說,我可能會在真正設定之前消耗這些值?事實並非如此,因爲我已經監視了第一次運行,並且變量,以及它們各自的值和對象設置在第一個aspx頁面上,第二個和第三個只使用用戶在表單上輸入的參數填充對象,如複選框,無線電和類似的,第四和最後,完整地加載所有變量。 –

+0

在Page_Load事件期間生成excel和html文件時使用這些變量。當這個事件完成時,Session_End突然被觸發並且變量被刷新。你認爲這是由於在Page_Load上使用了變量而引起的嗎?沒有檢查它是否是回發,因爲此頁面僅用於生成報告和創建鏈接,沒有別的。這是一個非常奇怪的方法,我建議它會在Button_Click上生成,但不是我定義這個狗屎的方法。 –

0

我在會議中遇到問題。在我的情況下,問題是應用程序池的最大工作者線程數。如果你要使用asp.net的默認會話,你必須使它1.或另一個線程無法獲得會話。