ASP.NET MVC Session 的使用筆記

2021-06-05

筆記 ASP.NET MVC 使用 Session 的相關事項。

logo

說明

啟用 Session

常見的 lifecyle 位置是 在 Global.asax 的 Session_start 進行設定,當 Request 時會自動呼叫 Session_start。

protected void Session_start()
{
    Session["user"] = User.Identity.Name;
    Session["count"] = 0;
}

⚠️ 而當 Session timeout 後,原本的保存內容會被清除,新的 Request 會再次呼叫 Session_start 以初始化 Session 內容。

存取 Session 的相關資訊

Session["user"]

Session["count"] = (int)Session["count"] + 1;

HttpContext.Current.Session.SessionID

HttpContext.Current.Session.IsNewSession

HttpContext.Current.Session.Count

調整 Session 的 timeout

web.config

<system.web>
  <sessionState timeout="1"></sessionState>
</system.web>

Session 清除

基本上 timeout 到達之後,Session 保存的內容會自動清除,但如果要提前清除(例如登出行為),可以使用 Session.Clear 或者 Session.RemoveAll。

但需要注意的如果是以 InProc Mode 搭配 Cookie 保存 SessionId 的方式,Cookie 也必須一併清除。

Session.Clear();
HttpCookie cookie = new HttpCookie("ASP.NET_SessionId", "");
cookie.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie);

實驗

Script

Global.asax

protected void Session_start()
{
    Session["user"] = User.Identity.Name;
    Session["count"] = 0;

    db.SessionState.Add(new SessionState()
    {
        SId = Session.SessionID,
        Message = "start",
        CountValue = (int)Session["count"],
        Timestamp = DateTime.Now
    });

    db.SaveChanges();

}

protected void Session_end()
{
    db.SessionState.Add(new SessionState()
    {
        SId = Session.SessionID,
        Message = "end",
        CountValue = (int)Session["count"],
        Timestamp = DateTime.Now
    });

    db.SaveChanges();

    Session.RemoveAll();
}

controller.cs

public ActionResult Lab()
{

    if (Session["count"] != null)
    {
        Session["count"] = (int)Session["count"] + 1;

        db.SessionState.Add(new SessionState()
        {
            SId = Session.SessionID,
            Message = "In controller",
            CountValue = (int)Session["count"],
            Timestamp = DateTime.Now
        });

        db.SaveChanges();
    }
    return View();
}

說明

Id 2 開始,Request Home/Lab 後,首先會從 Global.asax Session_start 初始化 Session 內容,並在 DB 留下紀錄。

Id 3 則是由 Home/Lab Action 所留下的 DB 紀錄,這邊特別會對 Session 是否為 null 做檢查,以免操作 Session 內容失敗。

Id 4、5 則是連續呼叫 Home/Lab Action,增加 Session["count"] 的數值。

Id 6 是當 1 分鐘的 Timeout 發生時,Global.asax Sessioni_end 自動被呼叫所留下的紀錄。

Id 7 是 Timeout 後第一次 refresh 自動再次呼叫 Global.asax Session_start 初始化 Session 內容。

Id 8 則是由 Home/Lab Action 將 count 值增加,並留下的 DB 紀錄。

參考資料

ASP.NET 小技巧 - 防止 Session 逾時與網頁閒置偵測