Startup.cs 檔案中進行配置
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache(); // 使用記憶體作為快取儲存 Session
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromMinutes(30); // 設定 Session 的過期時間
options.Cookie.HttpOnly = true; // 使 cookie 僅透過 HTTP 傳輸
options.Cookie.IsEssential = true; // 在 GDPR 下使 cookie 必須
});
services.AddControllersWithViews(); // 或者 services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession(); // 使用 Session 中介軟體
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
在控制器中使用 Session
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
public class HomeController : Controller
{
public IActionResult Index()
{
// 儲存資訊到 Session
HttpContext.Session.SetString("UserName", "John Doe");
// 讀取 Session 中的資訊
string userName = HttpContext.Session.GetString("UserName");
ViewBag.UserName = userName;
return View();
}
}
使用擴充套件方法
.NET Core 提供了方便的擴充套件方法來儲存和檢索不同型別的資料:
SetString(string key, string value)
GetString(string key)
SetInt32(string key, int value)
GetInt32(string key)
如果需要儲存複雜物件,可以將其序列化為 JSON 字串,然後使用 SetString 儲存,再用 GetString 讀取後反序列化。
// 儲存複雜物件
var myObject = new MyClass { Property1 = "Value1", Property2 = 123 };
HttpContext.Session.SetString("MyObject", JsonConvert.SerializeObject(myObject));
// 讀取複雜物件
var myObjectJson = HttpContext.Session.GetString("MyObject");
if (myObjectJson != null)
{
var myObject = JsonConvert.DeserializeObject<MyClass>(myObjectJson);
}
注意事項
Session 的資料儲存在伺服器端,客戶端只儲存一個 Session ID 的 cookie。當使用者首次訪問應用程式時,伺服器會生成一個唯一的 Session ID,並將這個 Session ID 儲存在一個名為 .AspNetCore.Session 的 Cookie 中 這個 Cookie 會在後續的請求中自動傳送到伺服器,以便伺服器識別使用者的 Session。
預設情況下,Session 使用記憶體快取儲存資料。如果您的應用程式需要在多個伺服器之間共享 Session,可以考慮使用分散式快取(如 Redis 或 SQL Server)。Session 的實際資料(如字串、整數、物件等)是儲存在伺服器端的記憶體中,或者儲存在配置的分散式快取(例如 Redis、SQL Server)中。
伺服器使用從客戶端傳送的 Session ID 來查詢並獲取相應的 Session 資料。
這樣,可以在 .NET Core 中使用 Session 來保持使用者資料或其他會話相關的資訊。