在 Web 开发领域,跨多个请求维护状态是一个关键方面。HTTP 的无状态特性要求开发人员实现持久保存用户数据的机制。这就是会话发挥作用的地方。在本文中,我们将探讨什么是会话、它们在 .NET 中的工作方式,并提供实际示例来说明它们的用法。
什么是会话?
会话是服务器端的信息存储,可用于在同一用户的多个请求中保留数据。会话对于维护 Web 应用程序的状态(例如用户身份验证状态、用户偏好、购物车内容等)至关重要。每个会话都由唯一的会话 ID 标识,该 ID 会发送到客户端并随后续请求返回。
.NET 中的会话工作原理
- 会话初始化:当用户第一次访问Web应用程序时,会创建一个新的会话,并生成一个唯一的会话ID,此ID存储在客户端的cookie中。
- 数据存储:会话对象用于在服务器端存储数据,与会话 ID 绑定。
- 后续请求:客户端每次发出请求时都会将会话 ID 发送回服务器。服务器使用此 ID 检索会话数据。
- 会话终止:会话可以由应用程序明确终止,也可以在一段时间不活动后过期。
在 ASP.NET Core 中启用和使用会话
要在 ASP.NET Core 应用程序中使用会话,您需要配置会话中间件。以下是分步指南:
步骤 1.配置会话状态
框架中包含用于管理会话状态的中间件。要启用会话中间件,Program.cs 必须包含:
- 任何 IDistributedCache 内存缓存。IDistributedCache 实现用作会话的后备存储。
- 调用 AddSession
- 调用 UseSession
以下代码显示如何使用 IDistributedCache 的默认内存实现来设置内存会话提供程序:
builder.Services.AddDistributedMemoryCache();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
app.UseSession();
上述代码设置了一个短暂的超时时间以简化测试。
中间件的顺序很重要。在 UseRouting 之后、MapRazorPages 和 MapDefaultControllerRoute 之前调用 UseSession。
会话状态配置完成后, HttpContext.Session 可用。
在调用 UseSession 之前无法访问 HttpContext.The 会话。
应用开始写入响应流后,无法创建具有新会话 cookie 的新会话。异常记录在 Web 服务器日志中,不会显示在浏览器中。
步骤 2.设置并获取会话数据
下面的示例显示如何设置和获取整数和字符串:
public class IndexModel : PageModel
{
public const string SessionKeyName = "_Name";
public const string SessionKeyAge = "_Age";
private readonly ILogger<IndexModel> _logger;
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnGet()
{
if (string.IsNullOrEmpty(HttpContext.Session.GetString(SessionKeyName)))
{
HttpContext.Session.SetString(SessionKeyName, "The Doctor");
HttpContext.Session.SetInt32(SessionKeyAge, 73);
}
var name = HttpContext.Session.GetString(SessionKeyName);
var age = HttpContext.Session.GetInt32(SessionKeyAge).ToString();
_logger.LogInformation("Session Name: {Name}", name);
_logger.LogInformation("Session Age: {Age}", age);
}
}
以下示例检索 Razor Pages 页面中 IndexModel.SessionKeyName 键(示例应用中为 _Name)的会话值:
@page
@using Microsoft.AspNetCore.Http
@model IndexModel
...
Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName)
序列化对象数据
即使使用内存缓存,所有会话数据都必须序列化才能启用分布式缓存方案。字符串和整数序列化器由 ISession的扩展方法提供。复杂类型必须由用户使用其他机制(例如 JSON)进行序列化。
使用以下示例代码来序列化对象:
public static class SessionExtensions
{
public static void Set<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonSerializer.Serialize(value));
}
public static T? Get<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default : JsonSerializer.Deserialize<T>(value);
}
}
使用会话的好处
- 状态管理:会话有助于维护多个请求的状态,这对于用户身份验证和购物车等功能至关重要。
- 安全性:会话中存储的数据保存在服务器上,从而降低了客户端操纵的风险。
- 便利性:会话通过提供一种简单的方法来存储和检索用户特定数据,从而简化了有状态 Web 应用程序的开发。
结论
会话是 .NET 中用于管理 Web 应用程序中状态的强大功能。它们提供了一种安全且方便的方式来跨多个请求存储用户特定数据。通过正确实施会话,您可以增强用户体验并在用户访问 Web 应用程序的整个过程中保持无缝交互。
理解并有效利用会话将帮助您构建强大、有状态的 Web 应用程序,从而提供更好的用户体验。无论是使用内存存储以简化操作,还是使用分布式缓存存储以增强可扩展性,会话都是任何 Web 开发人员必备的工具。
标签:Web,Session,管理,HttpContext,应用程序,会话,了解,NET,public From: https://blog.csdn.net/xiefeng240601/article/details/140100240