首页 > 其他分享 >了解 .NET 中的会话管理

了解 .NET 中的会话管理

时间:2024-07-02 09:01:14浏览次数:3  
标签:Web Session 管理 HttpContext 应用程序 会话 了解 NET public

在 Web 开发领域,跨多个请求维护状态是一个关键方面。HTTP 的无状态特性要求开发人员实现持久保存用户数据的机制。这就是会话发挥作用的地方。在本文中,我们将探讨什么是会话、它们在 .NET 中的工作方式,并提供实际示例来说明它们的用法。

什么是会话?

会话是服务器端的信息存储,可用于在同一用户的多个请求中保留数据。会话对于维护 Web 应用程序的状态(例如用户身份验证状态、用户偏好、购物车内容等)至关重要。每个会话都由唯一的会话 ID 标识,该 ID 会发送到客户端并随后续请求返回。

.NET 中的会话工作原理

  1. 会话初始化:当用户第一次访问Web应用程序时,会创建一个新的会话,并生成一个唯一的会话ID,此ID存储在客户端的cookie中。
  2. 数据存储:会话对象用于在服务器端存储数据,与会话 ID 绑定。
  3. 后续请求:客户端每次发出请求时都会将会话 ID 发送回服务器。服务器使用此 ID 检索会话数据。
  4. 会话终止:会话可以由应用程序明确终止,也可以在一段时间不活动后过期。

在 ASP.NET Core 中启用和使用会话

要在 ASP.NET Core 应用程序中使用会话,您需要配置会话中间件。以下是分步指南:

步骤 1.配置会话状态

框架中包含用于管理会话状态的中间件。要启用会话中间件,Program.cs 必须包含:

  1. 任何 IDistributedCache 内存缓存。IDistributedCache 实现用作会话的后备存储。
  2. 调用 AddSession
  3. 调用 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

相关文章

  • 五分钟了解MQ消息集成
    一、MQ消息集成的定义MQ消息集成是通过消息中间件(MessageQueue)实现的一种数据集成方式。它通过将数据发送到中间件中,再从中间件中接收数据,实现不同系统之间的数据交换。在MQ消息集成中,发送者和接收者之间不需要直接建立连接,而是通过消息中间件来实现数据传输。消息中间件......
  • 基于web的酒店客房管理系统 毕业设计 springboot+Vue+mysql
    介绍我开发了一个基于Web的酒店客房管理系统,旨在通过现代化的管理工具提升酒店客房管理的效率和用户体验。该系统分为管理员角色和用户角色,管理员负责管理用户、客房信息、预约、入住、退房等内容,用户则可以查询客房信息、进行预约、管理入住和退房等操作。系统通过丰富的功能......
  • EasyDesktop 浏览器书签管理从未如此简单
    作为一名软件开发从业人员,每天80%的时间都在与浏览器打交道,一半的时间在用浏览器开发调试,另一半时间则是在互联网上搜寻各种知识和资源.为此,我的浏览器书签栏存储和很多非常棒的链接,多到2k屏幕分辨率下一栏都放不下,为此我只好把这些书签的名称改的短一点,这样就能......
  • Kubernetes Node删除镜像
    目录KubernetesNode删除镜像步骤1:连接到节点步骤2:查看节点上的镜像列表步骤3:删除镜像步骤4:验证删除注意事项结论KubernetesNode删除镜像本篇博客将介绍如何在Kubernetes集群中删除节点上的镜像。Kubernetes是一个开源的容器编排平台,可用于以高效的方式管理容器化......
  • 6、Django-管理员界面-admin
    概念:Django的admin界面是自动生成的,它根据你的模型类自动创建表单和列表视图。你只需将模型类注册到admin界面,就可以轻松地管理和操作数据库中的数据。admin界面提供了各种功能,包括:列表视图:以表格形式展示数据库中的数据,支持分页、搜索和排序功能,方便快速浏览和筛选数据。表......
  • 11、 Django-模型基础-models-ORM框架-管理器对象
     #概述django根据属性的类型确定以下信息当前选择的数据库支持字段的类型渲染管理表单时使用的默认htm1控件在管理站点最低限度的验证django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后则django不会再生成默认的主键列#属性命......
  • 【毕设源码】基于Springboot的加油站管理小程序
    本项目分为两个角色,分别是管理员和用户,其中管理员使用的是web管理后台,用户为微信小程序源码获取请私信技术部分:前端:1.管理员为html+css+js2.用户是微信小程序原生开发,使用微信开发者工具,wxml+wxss+js3.后端:Springboot(如需PHP版本请私信)4.数据库:MySql管理员:1.登......
  • 48、k8s-安全认证-授权管理-角色创建、用户绑定角色
    授权发生在认证成功之后、同i过认证就可以知道请求用户是谁、然后kubernetes会根据事先定义的授权策略来决定用户是否有权限访问、这个过程就称为授权每个发送到APIServer的请求都带上了用户和资源的信息:比如发送请求的用户、请求的路径、请求的动作等、授权就是根据这些信息和......
  • 47、k8s-安全认证-认证管理
    kubernetes集群安全的最关键点在于如何识别并认证客户端的身份、它提供了三种客户端身份认证方式:·HTTPBase认证:通过用户名+密码的方式认证··这种认证方式是把用户名和密码用Base64算法进行编码后的字符串放在http请求中的headerAuthorization域里发送给客户......
  • 从这几个优点了解快速自定义表单开发开源
    要实现提质增效的办公,需要应用什么软件平台?可以一起了解低代码技术平台、自定义表单开发开源。它们具有其他平台没有的优势特点,如可视化操作界面、更灵活、好操作、易维护等,因此,在竞争激烈的社会中,得到了各中大型企业的喜爱与支持。本文将罗列它的几个优势特点,让您清楚了解快速自......