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 来保持用户数据或其他会话相关的信息。