了解 .NET 中的会话管理

在 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 开发人员必备的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

set_source_files_properties QT_QML_SINGLETON_TYPE

目录 前言 QT_QML_SINGLETON_TYPE 属性 基本用法 示例 1. 创建一个基本的 CMake 项目 2. 编辑 CMakeLists.txt 3. 创建 main.cpp 4. 创建 MySingleton.qml 5. 创建 qml.qrc 6. 创建 main.qml 构建和运行项目 结论 前言 在使用 Qt 和 CMake 构建项目时&#xff0c;…

weapp.socket.io.js

!function(t,e){if(“object"typeof exports&&"object"typeof module)module.exportse();else if("function"typeof define&&define.amd)define([],e);else{var re();for(var n in r)(“object"typeof exports?exports:t)[n]r[…

探索未知:sklearn处理未知类别数据的策略

探索未知&#xff1a;sklearn处理未知类别数据的策略 在机器学习项目中&#xff0c;我们经常遇到带有未知类别的数据&#xff0c;这些数据可能因为各种因素而缺失或无法归类。有效地处理这些未知类别对于构建鲁棒的模型至关重要。本文将深入探讨sklearn如何处理带有未知类别的…

解决Java中的NoRouteToHostException异常的方法

解决Java中的NoRouteToHostException异常的方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java开发中&#xff0c;网络编程是非常重要的一部分&#x…

某腾X滑块验证码

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE= 1. 先整体分析一下 1_1. 验证码信息下发接口 cap_union_prehandle ua:…

JS基础与Chrome介绍

导言 在Web开发中后端负责程序架构和数据管理&#xff0c;前端负责页面展示和用户交互&#xff1b;在这种前后端分离的开发方式中&#xff0c;以接口为标准来进行联调整合&#xff0c;为了保证接口在调用时数据的安全性&#xff0c;也为了防止请求参数被篡改&#xff0c;大多数…

白骑士的Python教学基础篇 1.5 数据结构

系列目录​​​​​​​ 上一篇&#xff1a;白骑士的Python教学基础篇 1.4 函数与模块 数据结构是编程语言中用于存储和组织数据的基本构件。在Python中&#xff0c;常见的数据结构包括列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、字典&#xff08…

深入理解 “androidx.databinding.DataBindingUtil“ 细节和使用

介绍 数据绑定&#xff08;Data Binding&#xff09;是 Android 中的一个强大功能&#xff0c;它允许你使用声明性格式而不是编程方式将布局中的 UI 组件绑定到应用中的数据源。androidx.databinding.DataBindingUtil 类是一个工具类&#xff0c;它提供了用于处理数据绑定的方…

容器技术-docker5

一、docker-compose 常用命令和指令 1. 概要 默认的模板文件是 docker-compose.yml&#xff0c;其中定义的每个服务可以通过 image 指令指定镜像或 build 指令&#xff08;需要 Dockerfile&#xff09;来自动构建。 注意如果使用 build 指令&#xff0c;在 Dockerfile 中设置…

【面试干货】Static关键字的用法详解

【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;static是一个关键字&#xff0c;它可…

MT19937 64bit 机器上的实现及原理解析

1&#xff0c; mt19937 实现源码 mt19937-64bit_ex.cpp /*References:T. Nishimura, Tables of 64-bit Mersenne TwistersACM Transactions on Modeling and Computer Simulation 10. (2000) 348--357.M. Matsumoto and T. Nishimura,Mersenne Twister: a 623-dimensionally e…

electron vite react 创建一个项目

要使用 Electron、Vite 和 React 创建一个项目,你可以按照以下步骤操作: 1. 安装 Node.js 和 npm 首先,确保你的计算机上安装了 Node.js 和 npm(Node Package Manager)。你可以从 Node.js 官网 下载并安装。 2. 初始化一个新的项目 在你的工作目录下,创建一个新的文件…

水果商城外卖微信小程序模板

手机微信水果外卖&#xff0c;水果电商&#xff0c;水果商城网页小程序模板。包含&#xff1a;主页、列表页、详情页、购物车、个人中心。 水果商城外卖小程序模板

[C++][设计模式][迭代器模式]详细讲解

目录 1.动机2.模式定义3.要点总结4.代码感受 1.动机 在软件构建过程中&#xff0c;集合对象内部结构常常变化各异。但对于这些集合对象&#xff0c;我们希望不暴露其内部结构的同时&#xff0c;可以让外部客户代码透明地访问其中包含的元素&#xff1b; 同时这种”透明遍历“也…

实现Java中的线程安全集合类

实现Java中的线程安全集合类 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、介绍 在多线程编程中&#xff0c;保证数据的线程安全性是至关重要的。Java提…

可燃气体报警器检测机构:严格遵守的安全标准

随着工业、商业和家庭领域对安全要求的不断提高&#xff0c;可燃气体报警器作为预防火灾和爆炸事故的重要设备&#xff0c;其性能稳定性和可靠性越来越受到关注。 可燃气体报警器检测机构应运而生&#xff0c;为确保这些设备的有效运行发挥着不可替代的作用。 接下来&#xf…

超强风冷制动电阻器-大功率对流冷却电阻器

风冷制动电阻 EAK 的风冷制动电阻器的制造功率范围为 5 kW 至 1200 kW。这些电阻器用于从螺旋桨、起重机、绞盘、顶部驱动器等倾倒多余的电力。 风冷电阻器是独立的单元&#xff0c;不需要进一步安装。该装置由内置风扇冷却。它也可以在没有风扇的情况下制作&#xff08;非强…

qt-webassembly 实现服务器上的文件下载到本地(浏览器)

1. c 实现 qt 代码 #include <QtCore> #include <QtNetwork> #include <QGuiApplication> #include <emscripten.h> #include <emscripten/html5.h> #include <emscripten/val.h> #include <emscripten/bind.h>using namespace emsc…

HTMLCSS(入门)

HTML <html> <head><title>第一个页面</title></head><body>键盘敲烂&#xff0c;工资过万</body> </html> <!DOCTYPE>文档类型声明&#xff0c;告诉浏览器使用哪种HTML版本显示网页 <!DOCTYPE html>当前页面采取…

php如何实现秒杀活动功能

随着电商、移动支付等行业的发展&#xff0c;商品的秒杀活动越来越受到消费者们的欢迎。而后台技术支持的php作为非常流行&#xff0c;广泛应用的开发语言&#xff0c;也被越来越多的企业采用用来实现秒杀活动。 那么&#xff0c;在PHP中&#xff0c;如何实现秒杀活动呢&#…