間歇性返回不正確的 ASP.NET 會話數據
我的任務是調查使用者會話在頁面刷新之間發生變化的問題。立即(對網站一無所知)我說這似乎是負載平衡/網路集群配置問題。但是,我後來發現該網站不是負載均衡的——它是一台伺服器。
該應用程序有一個儲存在 Session 中的 Basket 對象。使用者將項目添加到購物籃等。當在購物籃頁面上時,如果刷新頁面,購物籃中的項目會發生變化,有時甚至沒有。
會話不會失去,它幾乎總是在下一次刷新時回來,但籃子可能是空的或在下一次刷新時有不同的內容。我以前見過這種行為很多次,但只在多伺服器設置上。
這是我們試圖在開發人員環境中複製但沒有成功的東西——我們根本無法複製問題,但在現場它發生了很多。
Web 應用程序是一個 ASP.NET WebForms 站點,在 Windows Server 2008 R2 和 IIS 7.5 上的 .NET 4.0 下執行。
會話狀態模式為 InProc,會話超時設置為 480 分鐘。
我使用 fiddler 查看請求和響應,並且每次傳遞給伺服器的 ASP.NET 會話 ID 都是相同的。除了返回的實際 HTML 之外,響應之間似乎沒有區別。
有沒有人對可能導致此問題的原因有任何想法?
更新1:
我重新處理了同事在購物籃程式碼中實現的一些日誌記錄。我現在可以看到 Session ID 保持不變,即使顯示不同的數據,Session 變數的值也保持不變。
抱歉,我應該在發布之前檢查他們的日誌記錄。
我確信這是一個伺服器問題,但程式碼在我們的測試環境中按預期工作。
“我說這似乎是負載平衡/Web 集群配置問題。但是,我後來發現該網站沒有負載平衡 - 它是單個伺服器。”
僅僅因為它是一台伺服器並不意味著沒有負載平衡。IIS 在其中有一個稱為“Web Garden”的功能,它將 Web 工作拆分到多個程序中,因此它可以分佈在多個 CPU 上。
它就像一個小型的“網路農場”——因此得名“網路花園”。:)
使用 Web Garden 的一個效果是它使 InProc 會話變數停止正常工作,因為您可能最終在每個頁面請求上處於不同的工作程序中。InProc (In Process) 只有在您始終處於同一個 Process時才能可靠地工作。
解決方案1:
確保 IIS 未設置為使用 Web Garden。去做這個:
- 打開 IIS 管理器。
- 確定您的 Web 應用程序正在使用哪個應用程序池。
- 右鍵點擊您的應用程序池並選擇“高級屬性”。
- 向下滾動並將“最大工作程序”設置為
1
.解決方案2:
- 使用會話狀態伺服器,其唯一任務是管理所有工作程序的會話狀態。
- 然後將 Web 應用程序從 InProc 更改為 StateServer。
- 查看配置狀態伺服器以維護會話狀態 (IIS 7)以開始使用。:)
查看此 MSDN 部落格:程序內會話狀態管理
它描述了您的會話狀態選項,以及如何對 InProc 會話失去進行故障排除。