我有一個In-Proc會話狀態的生產問題。MVC3 .NET會話隨機丟失會話值並返回爲空
我們的應用程序基於MVC 3 .NET框架,並集成到我們運行Sitecore CMS的站點中。
我們的用戶在整個應用程序流程中都會遇到「對象引用未設置爲對象的實例」。
經過廣泛的日誌記錄和跟蹤之後,我們可以得出結論,這是在會話對象返回null時導致的。
下面是關於我們發現的以及我們所知道的一些細節。
- 會話ID對於同一個用戶持續存在,並以正確的方式將所有的 傳遞給應用程序。
- 我不認爲這是一個代碼問題,因爲這隻發生在隨機時間間隔的生產中,絕不會發生在本地,開發或分段環境中。
- 有兩臺生產服務器通過負載平衡器運行。
- 不是服務器持久性問題,因爲我們通過睡眠服務器之一併將所有流量路由到一臺服務器進行測試。通過日誌記錄,我們可以確定用戶正在訪問同一臺服務器,但會話已變爲空。
- 這似乎也不是一個客戶端問題,因爲即使它們以前遇到錯誤,它們也能夠成功地通過應用程序。
- 這似乎不是一個流量負載或服務器負載問題,因爲它發生在隨機時間的一天,發生在隨機用戶期間。
- 這似乎不是由回收應用程序池造成的。
- 這似乎不是由會話超時引起的,因爲我們將超時設置爲兩個小時,而在我們跟蹤日誌時,用戶可以在流中體驗這個5-10分鐘。
備註:由於我們的Sitecore CMS,我們必須使用In-Proc會話狀態。所以改變設計不是一種選擇。
我有一個理論,它可能與會話鎖定或從併發訪問嘗試損壞有關。
有幾個地方我們看到這個問題的發生很多從我們的應用程序是當用戶被JavaScript(windows.location)重定向。
而在正在進行異步ajax調用的區域。
我們在這個問題上一直在撓頭,我想知道有沒有人會對這個問題有什麼看法或理論?
感謝
新增注:
@Mystere & & @ H27Studio,所以我也發現了關於會話ID或會話重置問題的東西。在某些情況下,我們發現在頁面重定向時,它會觸發對該方法的兩次重複GETS調用,第一次調用缺少sessionID並隨機重定向到其中一個服務器(這是因爲來自負載均衡器的服務器持久會話是基於客戶端IP,會話ID和其他頭信息創建獨特的會話,以保持客戶端在一臺服務器上)。當我們的重定向頁面使用window.location時,每次都會發生這種情況。
如果bad,no sessionID調用碰到同一臺服務器,這將導致客戶端的「Object reference not set ..」問題。 (這可能是因爲沒有sessionID的第一次錯誤調用導致應用程序創建覆蓋原始會話對象的新會話)因此,即使在正確的sessionID傳遞到應用程序的第二個調用中,我們也會發現session對象包含null 。
所以我相信有重複調用清除會話對象的問題,它不知道爲什麼或者是什麼原因造成的。
任何人都有這方面的線索?謝謝
更新: 我們計劃採取這些步驟,希望能夠解決此問題。
- 我們在製作異步Ajax調用的地方存在問題,所以我們打算刪除異步功能並讓它同步運行Ajax。
- 我們遇到了Windows.location的JavaScript重定向發生的問題。我們已經創建了一個使用回傳的替代方法,希望能夠解決這個問題。
- 其他與上述問題無關的區域仍然懸而未決。
一旦我們將其部署到生產環境中,更改的效果將會發布。
感謝您的所有意見。
不信任會話超時。如果服務器需要更多內存,它將釋放會話。我有一個小時的工作時間,大多數人在20分鐘之前會休會,有時會在5-10分鐘之內。 (它是一臺擁有69Gbs內存的機器,而且流量不是很大......) – H27studio
我的公司一直在爲此撓頭,即使在使用'inproc'進行'elmah'等測試之後...... –
@ H27studio,你有沒有參考「如果服務器需要更多的內存,它將釋放會話」? –