2010-07-08 47 views
0

我有一個運行在兩個負載平衡服務器上的ASP.NET應用程序。除了一組客戶之外,一切工作都很好。所有這些客戶都來自同一家公司。隨機地,拋出一個未處理的NullReferenceException錯誤。它隨機發生在隨機的地方。看起來好像會議完全沒了。由於這只是針對特定用戶羣發生的,我不得不認爲這與他們的環境有關。我看到用戶使用IE6,IE7,IE8和FF,並且在所有情況下都會出現錯誤。ASP.NET會話丟失,但僅限於一個特定用戶

我不是100%確定如何解決這個問題。有沒有人有任何想法?

編輯:會話設置爲「是InProc」

<sessionState mode="InProc" cookieless="false" timeout="20" /> 
+0

您使用的是什麼負載平衡機制? – 2010-07-08 22:13:43

回答

1

我接觸到了有用戶的用戶。我讓他打開一個瀏覽器並轉到whatsmyip.org並告訴我他的IP地址是什麼。然後我讓他刷幾次屏幕。那麼,你不知道嗎,IP地址改變了。它一直在兩個不同的IP地址之間切換。這不是他的機器的IP地址,而是兩個不同的代理。每個請求都可能來自一個或另一個顯然。

我們的負載均衡器(我稱之爲宙斯 - 我不是網絡人)被設置爲使用IP地址建立會話親和性(又名粘性連接)。我們更改了這些設置,以便負載均衡器放棄一個cookie並使用它來維護會話,現在一切正常。

0

如果你使用SQL存儲會話狀態,檢查場中的所有服務器都在看相同的SQL數據庫 - 我之前被這個人抓住了,花了相當長的一段時間來解決這個問題!

編輯: 實際上,您可能需要將它設置爲StateServer,因爲您正在網絡農場中運行。 從MSDN請參閱關於Session-State Modes的相關信息。

+0

會話設置爲InProc(問題已被修改),謝謝。 – HitLikeAHammer 2010-07-08 22:02:01

0

如果您的負載均衡是基於將每次命中指向最不繁忙的服務器,那麼InProc將不起作用。您需要使用StateServer或SQLServer模式。

想象一下,來自客戶端的第一個命中是指向服務器A--在服務器A上啓動一個新會話。來自同一客戶端的第二個命中可以去服務器B,從服務器B提供會話cookie,服務器B不會不承認。

如果您有「粘性」(或客戶端關聯性)負載平衡,其中第一個命中分配給最不繁忙的服務器,但後續來自同一會話的命中定向到同一個服務器,那麼InProc仍應仍工作。

+0

我們使用粘連接。事實上,只有一小羣用戶纔會讓我覺得這是他們網絡中的事情。也許IP地址是每個請求或類似的東西改變。 – HitLikeAHammer 2010-07-08 22:16:33

1

InProc會話不在服務器之間共享,因此聽起來像這組用戶正在從一臺服務器移動到另一臺服務器,其他服務器不是。也許你的負載平衡器試圖使用諸如IP地址之類的東西來實現粘性會話,並且這個組織正在阻止這些信息。

+0

像這樣的東西可能是問題。假設是這樣,有什麼我可以從應用程序端來解決它? – HitLikeAHammer 2010-07-08 22:58:29

+0

最簡單的事情可能是設置其他會話狀態模式之一(兩者都可以在服務器之間共享)。 如果由於您在服務器/數據庫上可以執行的操作而受到限制,那麼您將不得不存儲用戶的數據,然後根據某種以隱藏形式傳遞的鍵自己檢索它字段或網址 - 或者您可以嘗試將這些網頁設置爲完全無狀態。這些選項中的任何一個都可能需要很大的努力,儘管如果你已經在很多地方使用會話了 - 再加上增加的安全性問題等等。 – FinnNk 2010-07-09 08:39:56