2011-05-23 91 views
6

在我的ASP.NET Web應用程序中,我在Page_Load()中調用Session.Abandon()。我希望這會立即放棄會議,下一次我參考HttpContext.Current.Session應創建一個新的會話。但是,在Global.asax中的Session_EndSession_Start處理程序上添加斷點指示在頁面完成呈現之前不會調用這些斷點。Session.Abandon()不會立即放棄會話

所以有兩個問題:

1)爲什麼?

2)一旦Session.Abandon()被調用,我怎樣才能在頁面生命週期內繼續使用HttpContext.Current.Session

提前致謝!

回答

10

http://msdn.microsoft.com/en-us/library/ms524310(v=vs.90).aspx

看看鏈接頁面上的備註部分。 看起來會話對象只是排隊等待刪除,並且直到代碼運行完畢纔會被刪除。

+0

謝謝Elad。所以看起來對於我的第二個問題的答案是,一旦Session.Abandon()被調用,繼續在當前頁面生命週期中使用會話對象並不是一個好主意,因爲它不會在頁面已呈現。 – 2011-05-23 13:52:31

+0

我認爲它可以在當前頁面上使用,但不在後續頁面上和/或頁面刷新/經歷另一次回發。在任何情況下,如果你打電話給session.abandon,logid指出你沒有更多的使用它:) – 2011-05-23 13:54:33

2

Session.Abandon()實際上會等待,直到頁面被渲染。

4

這是我的解決方案:

private void PurgeSession() 
{ 
    try 
    { 
     Session.Clear(); 
    } 
    catch (Exception) { } 

    try 
    { 
     Session.Abandon(); 
    } 
    catch (Exception) { } 

    try 
    { 
     Session.RemoveAll(); 
    } 
    catch (Exception) { } 

    try 
    { 
     Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId") 
           {Expires = DateTime.Now.AddYears(-1)}); 
    } 
    catch (Exception) { } 
} 

這實際上是軌道轟炸選項。

部分信息來源於:http://www.dotnetfunda.com/articles/article1395-how-to-avoid-the-session-fixation-vulnerability-in-aspnet-.aspx

+0

我也明白有一些方法可以從web.config中獲取「ASP.NET_SessionId」以支持人們是否改變了他們的會話cookie名稱,但我並不在意,因爲我使用了默認名稱。 – 2013-06-12 17:06:31