2017-06-01 56 views
2

MVC noob here。ASP.net MVC 5 Session在調用Abandon之後未清除()

目前,我有這個代碼,激發了我的的HomeController當通過AJAX頁面加載:

namespace ETTData.Controllers 
{ 
    public class HomeController : Controller 
    { 
    [HttpPost] 
    public ContentResult clearSessions() 
    { 
     var currentSession = System.Web.HttpContext.Current.Session; 

     System.Diagnostics.Debug.WriteLine("BEFORE: " + currentSession.Timeout); 

     currentSession.Abandon(); 
     //currentSession.RemoveAll(); 
     //currentSession.Clear(); 

     System.Diagnostics.Debug.WriteLine("AFTER : " + currentSession.Timeout); 

     return new ContentResult { Content = "OK", ContentType = "text/plain" }; 
    } 
    } 
} 

的Debug.WriteLine的輸出是:

BEFORE:35

AFTER:35

因此,大家可以看到它有在之前但也有爲當它不應該,因爲我用currentSession.Abandon等於什麼();在調用該輸出之前調用

我通過的Global.asax.cs文件中設置會話超時:

namespace ETTData 
{ 
    public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Session_Start(Object sender, EventArgs e) 
     { 
      HttpContext.Current.Session.Timeout = 35; 
     } 
    } 
} 

所以說所有 - 我不知所措,爲什麼它不清除會議...

回答

1

看看this question找到答案。

簡而言之:Session.Abandon銷燬會話,但不清除它的值。請求結束時會發生這種情況。 Session.Clear清除會話中的所有內容,但不會將其摧毀。

2

是的,這很好的讓我在WebForms很久以前也一樣。

問題是,您的會話被綁定到會話cookie。
Cookie在請求和響應頭中傳輸,這意味着通過HTTP協議。 HTTP協議是無狀態的,因此在發送響應之前它不能刪除cookie。

當您調用session.Abandon時,會話數據將在cookie放棄在客戶端的同時被放棄。這意味着框架將會話數據標記爲「在發送響應之後將被清除」,該響應在response.end之後。在response.end(將在ContentResult.ExecuteResult之後調用),框架將清除會話。隨後它將調用Session_End事件。

Session.Clear會立即刪除項目,但不會刪除會話cookie - 因此它也不會結束會話,也不會調用Session_End事件 - 這是因爲它不會過期會話cookie 。

把它看作異步函數。
您已放棄,但尚未執行。
正如其他人告訴你的,如果您需要立即清除會話,請在session.abandon之後調用session.clear。

但是,如果您在撥打session.abandon之後開始另一個會話,則會遇到非常尖銳的刀。

基本上,你不應該使用會話。
如果要訪問「會話」數據而不繞道數據庫,則應該將信息存儲在加密且不對稱簽名的cookie中,如果需要,可以將該信息綁定到會話生存期,但如果您不想不必。 Google JWT瞭解更多信息。我會將這些數據綁定到您的auth-cookie中。這樣,就不需要> 1個餅乾。 ASP.NET中默認的20分鐘超時是一件非常糟糕的事情。您的會話數據不應過期,直到您的身份驗證。