2012-01-25 83 views
7

我有一個In-Proc會話狀態的生產問題。MVC3 .NET會話隨機丟失會話值並返回爲空

我們的應用程序基於MVC 3 .NET框架,並集成到我們運行Sitecore CMS的站點中。

我們的用戶在整個應用程序流程中都會遇到「對象引用未設置爲對象的實例」。

經過廣泛的日誌記錄和跟蹤之後,我們可以得出結論,這是在會話對象返回null時導致的。

下面是關於我們發現的以及我們所知道的一些細節。

  1. 會話ID對於同一個用戶持續存在,並以正確的方式將所有的 傳遞給應用程序。
  2. 我不認爲這是一個代碼問題,因爲這隻發生在隨機時間間隔的生產中,絕不會發生在本地,開發或分段環境中。
  3. 有兩臺生產服務器通過負載平衡器運行。
  4. 不是服務器持久性問題,因爲我們通過睡眠服務器之一併將所有流量路由到一臺服務器進行測試。通過日誌記錄,我們可以確定用戶正在訪問同一臺服務器,但會話已變爲空。
  5. 這似乎也不是一個客戶端問題,因爲即使它們以前遇到錯誤,它們也能夠成功地通過應用程序。
  6. 這似乎不是一個流量負載或服務器負載問題,因爲它發生在隨機時間的一天,發生在隨機用戶期間。
  7. 這似乎不是由回收應用程序池造成的。
  8. 這似乎不是由會話超時引起的,因爲我們將超時設置爲兩個小時,而在我們跟蹤日誌時,用戶可以在流中體驗這個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 。

所以我相信有重複調用清除會話對象的問題,它不知道爲什麼或者是什麼原因造成的。

任何人都有這方面的線索?謝謝

更新: 我們計劃採取這些步驟,希望能夠解決此問題。

  1. 我們在製作異步Ajax調用的地方存在問題,所以我們打算刪除異步功能並讓它同步運行Ajax。
  2. 我們遇到了Windows.location的JavaScript重定向發生的問題。我們已經創建了一個使用回傳的替代方法,希望能夠解決這個問題。
  3. 其他與上述問題無關的區域仍然懸而未決。

一旦我們將其部署到生產環境中,更改的效果將會發布。

感謝您的所有意見。

+0

不信任會話超時。如果服務器需要更多內存,它將釋放會話。我有一個小時的工作時間,大多數人在20分鐘之前會休會,有時會在5-10分鐘之內。 (它是一臺擁有69Gbs內存的機器,而且流量不是很大......) – H27studio

+0

我的公司一直在爲此撓頭,即使在使用'inproc'進行'elmah'等測試之後...... –

+2

@ H27studio,你有沒有參考「如果服務器需要更多的內存,它將釋放會話」? –

回答

5

經過幾個月的搜索和調試,我想我們終於得出結論。 Sitecore Analytics Robots會話超時似乎存在一個錯誤。我們首先注意到,每當隨機會話丟失是由於會話過早超時,那麼我們注意到這些會話被設置爲1分鐘超時而不是120分鐘。

搜索完所有配置文件後,我們注意到Sitecore Analytic.Robots.SessionTimeout是唯一的超時值,設置爲1分鐘。

通過增加此值,它解決了我們的會話超時問題。

因此,根本問題是Sitecore Analytics將某些訪客會話錯誤識別爲機器人會話並將其超時重新分配爲1分鐘。這可能是一個報告錯誤。

更新:從Sitecore的 響應:

Sitecore的CMS被設計爲與ASP.NET的WebForms技術的使用。在使用網頁表單時,機器人檢測依賴於頁面中的控件。很自然,你不能在ASP.NET MVC應用程序中使用它,但有一個簡單的解決方案 - 將下面的代碼放入元素中:

<% 
if (Context.Diagnostics.Tracing || Context.Diagnostics.Profiling) 
{ 
    Response.Write("<!-- Visitor identification is disabled because debugging is active. -->"); 
} 
else if (Tracker.IsActive && (Tracker.Visitor.VisitorClassification == 925)) 
{ 
    Response.Write("<link href=\"/layouts/System/VisitorIdentification.aspx\" rel=\"stylesheet\" type=\"text/css\" />"); 
} 
%> 
0

我認爲你的問題可能是你引入的異步ajax調用。我最近閱讀了David Hayden撰寫的一篇文章,討論了在同一會話中併發ajax請求的問題導致問題。無論如何,這是需要看的東西。希望它有幫助。

http://davidhayden.com/blog/dave/archive/2011/02/09/SessionLessControllersMvc3.aspx

他就在帖子的末尾談到它。

+0

當啓用會話狀態時,Ajax請求不會引起問題,它們只會在服務器上一個接一個地執行以防止並行訪問。這是一個性能問題,與OP會議中消失的問題無關。 – Jan

+0

我讀過這篇文章,並認爲這也可能是一個問題,但正如Jan所說。如果處於讀/寫狀態,會話狀態應該鎖定。因此,併發的ajax請求只需要按順序執行。不應該破壞會話。即使這將是原因,我認爲它會發生在一個恆定的基礎上,而不是隨機的間隔。但這是我不太自信的一個領域,也許有人有一個很好的方法來驗證這是否是問題?謝謝 –

+0

性能問題是的,但他也提到會議可能會腐敗,這就是我提出的原因。只是想幫助。 – Perry