Windows-Server-2008-R2

間歇性返回不正確的 ASP.NET 會話數據

  • March 7, 2017

我的任務是調查使用者會話在頁面刷新之間發生變化的問題。立即(對網站一無所知)我說這似乎是負載平衡/網路集群配置問題。但是,我後來發現該網站不是負載均衡的——它是一台伺服器。

該應用程序有一個儲存在 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。去做這個:

    1. 打開 IIS 管理器。
    2. 確定您的 Web 應用程序正在使用哪個應用程序池。
    3. 右鍵點擊您的應用程序池並選擇“高級屬性”。
    4. 向下滾動並將“最大工作程序”設置為1.

應用程序池設置

解決方案2:

查看此 MSDN 部落格:程序內會話狀態管理

它描述了您的會話狀態選項,以及如何對 InProc 會話失去進行故障排除。

引用自:https://serverfault.com/questions/596782