Session

Josen_Earth發表於2024-08-19

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 來保持使用者資料或其他會話相關的資訊。

相關文章