2011-10-13 89 views
0

我有一個非常奇怪的ASP.net間歇性會話持久性問題。首先,一些事實:非常不尋常的ASP.net會話變量持久性

環境:

  • F5與粘性會話負載均衡啓用:
  • 的Web服務器:2 * 的Windows Server 2008 R2,
  • .NET Framework版本:2.0.50727, IIS7,
  • 數據庫服務器:SQL Server 2008 R2的
  • 會話協議:ASP.net是InProc會話超時設置爲20分鐘,無cookie =假
  • CMS:CMS曄 400.net

好上的問題。

我們有一些自定義的VB.net會話值,它們在我們的網站中設置爲購物車。有時這些變量中的一些似乎失去了持久性。我說了一些,因爲主要會議仍然持續。我認爲主要的罪魁禍首是這個傢伙:

Shared Sub New() 
    ' If the cart is not in the session, create one and put it there 
    ' Otherwise, get it from the session 
    If HttpContext.Current.Session("ASPNETShoppingCart") Is Nothing Then 
     Instance = New ShoppingCart() 
     Instance.Items = New List(Of CartItem) 
     HttpContext.Current.Session("ASPNETShoppingCart") = Instance 
    Else 
     Instance = CType(HttpContext.Current.Session("ASPNETShoppingCart"), ShoppingCart) 
    End If 

End Sub 

即使這個會話對象仍然是持久的,它並沒有顯示出來,當我運行跟蹤:

例如

我的其他會話變量如Session(「userId」)顯示在跟蹤中,而我從來沒有看到Session的值(「ASPNETShoppingCart」) - 我認爲這很奇怪 - 也許這是因爲它是一個對象,到一個字符串?

我直接繞過它並直接調用的代碼在服務器上排除了與負載均衡的問題。

我知道什麼時候發生的問題,因爲我仍然登錄等會話值出現在屏幕上完整的會話不被破壞 - 但我的購物車值沒有。

有沒有人有任何想法可能會導致這樣的事情?有沒有辦法保護一個會話變量,或者至少在它改變狀態時被通知,這樣我可以跟蹤是什麼造成了這種情況?

回答

1

事實上,奇怪的是「有些」變量會丟失,有些則不會。

也許你有某種形式的,再現了「用戶名」(從身份驗證cookie,例如)「回退」機制,同樣不發生其他對象。

一般情況下,我會避免使用不惜一切代價InProc會話狀態,因爲每當asp.net工作進程獲取的再生 - 和這可以在任何時間發生,在會話都將丟失。由於您使用粘性會話,我的建議是您使用本地StateServer切換到OutOfProcess模式。您可以閱讀more here.配置非常簡單;只需修改Web.config並確保ASP.NET State服務在服務器上啓動。

唯一需要注意的是,所有對象都需要可序列化,但如果您在Session中沒有存儲異國情調,則只需使用[Serializable]屬性裝飾對象。

+0

嗨伊卡洛斯,感謝您的反饋。我確實已經考慮將我的協議切換到OutofProcess並將它們存儲在數據庫中 - 但是在我採用那個'核'選項之前,我希望能夠明確爲什麼只有這個會話對象正在失去持久性。奇怪的是,我無法在生產服務器的另一個鏡像上重新創建它。相同的代碼,相同的數據庫等,所以我認爲這是一些像IIS設置的環境變量,干擾會話的Windows服務,一些防病毒或防火牆差異(你明白了!) –

+0

好,你有一面鏡子生產,但您也需要能夠重現與生產環境相同的負載條件。我希望你在生產服務器上沒有防病毒軟件。我會非常生氣,會有人這樣做。 – Icarus

+0

所以我會 - 我自己不控制主生產環境的系統管理元素,所以我不能排除任何東西! –