ASP.NET MVC Session 的使用筆記
2021-06-05
筆記 ASP.NET MVC 使用 Session 的相關事項。
說明
啟用 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 紀錄。