2011-11-25 39 views
0

我希望每個會話只能執行一段代碼,因此如果用戶在同一會話中導航到包含此代碼的頁面,我不希望這樣段被執行。代碼位於登錄後調用的默認頁面,用戶可以從其他頁面導航到此默認頁面。會話變量在Visual Studio和服務器上行爲不同

我的解決方案:

if (Session["MySessionName"] == null && ConditionTwo) //initially MySessionName won't exist so the if condition resolves to true 
{ 
    //Assign Value to MySessionName so the if condition resolves to false next time 
    Session["MySessionName"] = "MySessionValue"; 
    //Do Something 
} 

我的問題:

這適用於Visual Studio的罰款,部署到測試服務器這個解決方案似乎不工作,所有的時間之後。如果我註銷並重新登錄,條件Session["MySessionName"] == null返回false並且代碼段將不會執行。但是,如果我關閉瀏覽器,重新打開並登錄,它可以正常工作。我檢查了註銷是否進行了適當的會話處理,並且確實如此。

我也試過,

HttpContext.Current.Session["MySessionName"] = "MySessionValue"; 
//and 
Session.Add("MysessionName", true); 

,但結果是一樣的。

+0

您是否希望每個新的_session_或每個_authentication_都發生這種情況?因爲這些是不同的東西。會話可以在認證之間持續存在(登錄/註銷) –

+0

我希望每次認證都會發生,每個登錄都需要執行一次。 – DiDi

回答

2

如果您使用表單身份驗證,則需要撥打FormsAuthentication.SignOut()

此外,在註銷時,您需要撥打Context.Session.Abandon()來終止當前會話。

我還確保在放棄會話之前始終明確地清除會話狀態中的任何敏感或用戶相關的值。

+0

感謝大家,你的回答和喬恩亞當斯的評論使我找到了正確的解決方案,我將會話變量添加到驗證模塊,以便它可以通過註銷過程放棄解決我的問題。 – DiDi

相關問題