
我的任務是調查使用者會話在頁面刷新之間發生變化的問題。我立即(對網站一無所知)說這似乎是一個負載平衡/網路叢集配置問題。然而,我後來發現該網站沒有負載平衡——它是一個單一的伺服器。
該應用程式有一個儲存在 Session 中的 Basket 物件。使用者將商品加入購物籃等。
會話不會丟失,它幾乎總是在下次刷新時返回,但購物籃可能是空的,或者在下次刷新時有不同的內容。我以前多次見過這種行為,但僅限於多伺服器設定。
這是我們嘗試在開發人員環境中複製的事情,但沒有成功 - 我們根本無法複製該問題,但在實際情況中這種情況經常發生。
這個 Web 應用程式是一個 ASP.NET WebForms 站點,在 Windows Server 2008 R2 和 IIS 7.5 上的 .NET 4.0 下運作。
會話狀態模式為 InProc,會話逾時設定為 480 分鐘。
我使用 fiddler 查看請求和回應,每次傳遞到伺服器的 ASP.NET 會話 ID 都是相同的。除了傳回的實際 HTML 之外,回應之間似乎沒有任何區別。
有誰對可能導致此問題的原因有任何想法嗎?
更新1:
我重新處理了同事在籃子程式碼中實現的一些日誌記錄。我現在可以看到會話 ID 保持不變,即使顯示不同的數據,會話變數的值也保持不變。
抱歉,我應該在發布此內容之前檢查他們的日誌記錄。
我確信這是一個伺服器問題,但程式碼在我們的測試環境中按預期工作。
答案1
“我說這似乎是一個負載平衡/網路叢集配置問題。但是,我後來發現該網站沒有負載平衡 - 它是單一伺服器。”
僅僅因為它是單一伺服器並不意味著沒有負載平衡。 IIS 具有稱為「Web Garden」的功能,該功能可將 Web 工作拆分到多個進程中,以便可以將其分佈到多個 CPU 上。
它就像一個小型“網絡農場”——因此得名“網絡花園”。 :)
使用 Web Garden 時的一個影響是,它會使 InProc 會話變數停止正常運作,因為您可能最終會在每個頁面請求上進入不同的工作進程。 InProc(進程中)只有在您始終結束時才能可靠地工作在同一個進程中。
解決方案一:
- 確保 IIS 未設定為使用網路花園。去做這個:
- 開啟 IIS 管理器。
- 確定您的網頁應用程式正在使用哪個應用程式集區。
- 右鍵單擊您的應用程式集區並選擇“進階屬性」。
- 向下捲動並設定“最大工作進程數「 到
1
。
解決方案2:
- 使用會話狀態伺服器,其唯一任務是管理所有工作進程的會話狀態。
- 然後將 Web 應用程式從 InProc 更改為 StateServer。
- 查看配置狀態伺服器以維護會話狀態 (IIS 7)開始吧。 :)
請參閱此 MSDN 部落格:進程內會話狀態管理
它描述了您的會話狀態選項,以及如何解決 InProc 會話遺失問題。
答案2
我已經很久沒有更改代碼了。
但我在Windows Server 2016中也遇到了同樣的問題。
然後我降級到舊伺服器(Windows 2012 r2)。我的問題解決了。我認為這是一個錯誤,但我不能確定
也許它會對你有幫助。