2012-07-05 87 views
1

我發現了描述類似於我的問題但不夠近的文章。我有一個非常間歇性的問題,一個用戶可以登陸另一個用戶會話,最終看到他們存儲在會話中的一些信息。以下是我的場景:我們在使用應用程序請求路由和Web場架構的負載平衡環境中使用AbleCommerce。我們使用進程內會話,但我們有粘性會話(客戶端/服務器關聯)配置和工作。我已經驗證沒有導致此問題的緩存(沒有使用頁面輸出緩存,沒有ARR緩存,沒有IIS或WAAS緩存)。存儲在會話中的信息偶爾會以別人的瀏覽器結束,並通過基於會話的單例對象存儲在會話中。錯誤會話的用戶

例如:

public class ExampleObject 
{ 
    public string ExampleData{get; set;} 

    public static TicketingSession Instance 
    { 
     get 
     { 
      if (HttpContext.Current.Session["ExampleObject"] == null) 
      { 
       HttpContext.Current.Session["ExampleObject"] = new ExampleObject(); 
      } 
      return (ExampleObject)HttpContext.Current.Session["ExampleObject"]; 
     } 
    } 
} 

然後在其他一些代碼,我可以用這個:

ExampleObject.Instance.ExampleData = "whatever"; 
//or 
txtSomeTextBox.Text = ExampleObject.Instance.ExampleData; 

我知道我應該避開在負載均衡的環境中清晰的靜態數據和進程內會話但因爲我使用客戶端/服務器親緣關係,並且由於我使用的這個靜態對象只是一個屬性,所以getter直接從會話狀態直接返回對象,我沒有看到問題。

回答

4

在網絡農業場景中,您需要離開inproc會話。您需要使用進程外會話存儲以確保Session ID是唯一的。

ASP.NET將其Session ID存儲在瀏覽器的Cookie集合中。如果用戶具有相同的Session ID,他們的會話將與服務器顯示相同。在同一臺服務器上使用單獨的服務器甚至工作進程可能會導致這些類型的衝突。

您可以通過MSDN on various Session-State modes supported by ASP.NET獲取更多詳情。

+0

我同意,如果兩個用戶最終在同一臺服務器上使用相同的ID,他們會看到相同的數據,因爲服務器將它們視爲同一用戶。然而,在我的情況下,這將要求ARR弄亂並且在第二個用戶分配第二個用戶不同的服務器之後將第二個用戶發送到第一個用戶服務器。如果他們被分配了相同的服務器,那麼負載平衡就無關緊要了,因爲這意味着一臺服務器給了兩個用戶相同的會話ID。 ARR是否有這樣的問題?它會解釋我斷斷續續地發生的狀態驗證錯誤。 – 2012-07-05 22:32:18

+0

我應該提一下,我們已經用一個aspx文件測試了我們的ARR親和力,該文件向您顯示了您登陸的服務器。您可以重新加載它,但是直到親緣關係cookie丟失或刪除,您總是會在同一臺服務器上結束。 – 2012-07-05 22:33:40

+0

我們已經切換到在SQL中存儲會話狀態。它似乎按預期工作。如果我們今後不再有這些問題,我會將其標記爲答案。謝謝您的幫助!! – 2012-07-09 19:30:12