asp.net core webapi 并发请求时 怎么保证实时获取的用户信息是此次请求的?

news2025/1/11 22:55:15

对于并发请求,每个请求会被分配到一个独立的线程或线程池工作线程上。通过 HttpContextAsyncLocal,每个线程都能独立地获取到它自己的上下文数据。由于这些数据是与当前请求相关的,因此在并发请求时不会互相干扰。

在并发请求时,确保每个请求能够实时获取与之相关的用户信息,主要依赖于以下方法:

  • HttpContext.User:ASP.NET Core 内置的请求上下文,保证每个请求独立获取用户信息。

  • AsyncLocal:用于在异步环境中传递请求相关的信息,确保跨线程和异步调用时的正确性。

  • AuthorizationFilterContext .HttpContext.Items:通过拦截器缓存用户信息,可以确保所有后续的请求处理都能正确访问用户信息。

  • 分布式缓存或会话存储:用于分布式应用场景,确保不同服务器上的请求能获取到正确的用户信息。

1. 使用 HTTP 请求上下文(如 HttpContext

在 ASP.NET Core 中,每个请求都是独立的,并且与当前线程绑定。当你发起一个请求时,ASP.NET Core 会将所有的请求上下文信息(包括认证、用户信息等)存储在 HttpContext 中。这意味着即使你有多个并发请求,每个请求的上下文都是独立的,可以保证每个请求都能获取到与该请求相关的用户信息。

获取用户信息:

你可以通过 HttpContext.User 来获取当前请求的用户信息:

public class MyController : ControllerBase
{
    public IActionResult Get()
    {
        var userId = User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        var username = User.Identity.Name;
        return Ok(new { userId, username });
    }
}

User 属性会在每个请求的上下文中自动填充,在每个请求线程中是独立的,因此不会发生并发请求时的混淆。

2. 使用 AsyncLocal 存储线程相关信息

在某些情况下,你可能需要跨多个方法、类或任务传递请求特定的信息(如用户信息)。AsyncLocal 提供了一种线程和任务绑定的方式,可以确保每个异步操作或线程都能获取到与当前请求相关的信息。

public class UserContext
{
    private static AsyncLocal<User> _currentUser = new AsyncLocal<User>();

    public static User CurrentUser
    {
        get => _currentUser.Value;
        set => _currentUser.Value = value;
    }
}

在每个请求的处理过程中,你可以将当前用户信息存储到 AsyncLocal 中,这样即使是异步操作,也能保证用户信息与当前请求相关。

使用方法:

在请求处理中,你可以在认证时设置用户信息:

public class MyController : ControllerBase
{
    public IActionResult Get()
    {
        // 假设从某处获取当前用户信息
        var user = new User { UserId = "123", Username = "JohnDoe" };
        UserContext.CurrentUser = user;

        return Ok(UserContext.CurrentUser);
    }
}

这种方法特别适用于需要跨多个异步方法传递用户信息的场景。

3. 使用拦截器IAuthorizationFilter注入用户信息

通过IAuthorizationFilter设置用户信息。这确保每个请求的用户信息都能被正确注入,尤其是在复杂的认证流程中。

 public class AuthorizationFilter : IAuthorizationFilter
 {
     public void OnAuthorization(AuthorizationFilterContext context)
     {
         //var user = context.HttpContext.User;
         //if (user == null || !user.HasClaim("role", "Admin"))
         //{
         //    context.Result = new UnauthorizedResult();
         //}
         context.HttpContext.Items["AccountDetail"] = "Admin";
     }
 }

在请求处理中,你可以通过 HttpContext.Items 来获取用户信息:

public class MyController : ControllerBase
{
    public IActionResult Get()
    {
        var serviceProvider = HttpContext.RequestServices;
 var account = serviceProvider?.GetRequiredService<IHttpContextAccessor>().HttpContext?.Items["AccountDetail"];
        return Ok(account);
    }
}

注:需提前注入IHttpContextAccessor

      // 注册 IHttpContextAccessor
      builder.Services.AddHttpContextAccessor();

4. 使用分布式缓存或会话存储

在分布式应用中,可能无法依赖单一的线程或请求上下文来存储用户信息,这时可以使用分布式缓存(如 Redis)或会话存储来保存每个请求的用户信息。这确保了无论请求在哪个服务器或进程中被处理,用户信息始终能够正确获取。

使用会话存储:

ASP.NET Core 提供了内置的会话机制,可以在请求之间存储用户信息。

public class MyController : ControllerBase
{
    public IActionResult Get()
    {
        // 假设你已经将用户信息存入 Session 中
        var userId = HttpContext.Session.GetString("UserId");
        return Ok(new { userId });
    }
}

在中间件或认证过程中,可以设置用户信息到会话:

public class UserContextMiddleware
{
    private readonly RequestDelegate _next;

    public UserContextMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var user = new User { UserId = "123", Username = "JohnDoe" };
        context.Session.SetString("UserId", user.UserId);

        await _next(context);
    }
}

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

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

相关文章

vscode开启调试模式,结合Delve调试器调试golang项目详细步骤

1.前期准备 (1).在vs code中的扩展程序中搜索并安装Go扩展程序 (2).安装 Delve 调试器 go install github.com/go-delve/delve/cmd/dlvlatest (3).打开vs code的命令面板&#xff0c;输入Go: Install/Update Tools&#xff0c;并单击该命令执行&#xff0c;安装或更新Go语…

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…

Python Matplotlib教程-Matplotlib 多子图布局

Python Matplotlib 多子图布局 Matplotlib 是 Python 中最常用的数据可视化库&#xff0c;它提供了强大的功能来绘制不同类型的图表。在实际应用中&#xff0c;通常需要将多个图表绘制在同一个画布上&#xff0c;这就需要用到 多子图布局。本篇文章将详细介绍如何使用 Matplot…

【Java项目】基于SpringBoot的【校园新闻系统】

【Java项目】基于SpringBoot的【校园新闻系统】 技术简介&#xff1a;本系统使用采用B/S架构、Spring Boot框架、MYSQL数据库进行开发设计。 系统简介&#xff1a;主要包括二大功能模块&#xff0c;即用户功能模块和管理员功能模块。系统中的核心用户是管理员&#xff0c;管理员…

c++入门之 命名空间与输入输出

1、命名空间 1.1使用命名空间的原因 先看一个例子&#xff1a; #include <iostream>int round 0;int main() {printf("%d", round);return 0; }请问&#xff0c;这个程序能跑起来吗&#xff1f; 答案是否定的 原因是&#xff0c;当我们想创建一个全局变量 …

【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)

前言 大家好&#xff0c;我是demon 这是demon给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击教程。 本阶段主要讲解XSS攻击获取用户cookie和用户密码。 喜欢的朋友们&#xff0c;记得给晓晓点赞支持和收藏一下&#xff0c;关注我&#xff0c;学习黑客技术。 简介 该…

HarmonyOS开发:ArkTS初识

ArkTS基本语法 ArkTS语言简介 ArkTS是鸿蒙生态的应用开发语言。基本语法风格与TypeScript&#xff08;简称TS&#xff09;相似&#xff0c;在TS的生态基础上进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。 基本语法概述 扩展能力 基础语法&#xff1a…

【YOLOv8杂草作物目标检测】

YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结&#xff1a; 农作物幼苗与杂草检测系统&#xff1a;基于YOLOv8深度学习框架&#xff0c;通过2822张图片训练了一个目标检测模型&#xff…

【python A* pygame 格式化 自定义起点、终点、障碍】

- pip install pygame test.py(chatgpt版本) 空格键&#xff1a;运行 A* 算法。CtrlC 键&#xff1a;清空路径。CtrlS 键&#xff1a;保存当前地图到 map.json 文件。CtrlL 键&#xff1a;从 map.json 文件加载地图。 import pygame import json from queue import PriorityQ…

xfs扩容目录lvm

pve增加磁盘&#xff1a; -bash-4.2# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 50G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 49G 0 part ├─centos-root 253:0 …

Pathview包:整合表达谱数据可视化KEGG通路

Pathview是一个用于整合表达谱数据并用于可视化KEGG通路的一个R包&#xff0c;其会先下载KEGG官网上的通路图&#xff0c;然后整合输入数据对通路图进行再次渲染&#xff0c;从而对KEGG通路图进行一定程度上的个性化处理&#xff0c;并且丰富其信息展示。&#xff08;KEGG在线数…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

【PPT解密】ppt只读文档怎么改成可编辑文档

PPT文档打开是只读模式&#xff0c;如何改成可编辑文档呢&#xff1f;这需要分几种情况来说&#xff0c;所以今天将介绍几种方法帮助PPT只读文档改为可编辑文档。 方法一&#xff1a; 我们可以先查看一下文件属性&#xff0c;属性中有只读属性&#xff0c;当我们打开文档之后…

[java基础-集合篇]优先队列PriorityQueue结构与源码解析

优先队列PriorityQueue 优先级队列表示为平衡二进制堆&#xff1a; queue[n] 的两个子级是 queue[2*n1] 和 queue[2*&#xff08;n1&#xff09;]。 注&#xff1a;左子节点index2*parentIndex1,右子节点index2*parentIndex2,源码中计算parent位置时就是这样反过来计算的 优…

ROS2+OpenCV综合应用--11. AprilTag标签码跟随

1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上&#xff0c;增加了小车车体运动的功能&#xff0c;控制车体从而使摄像头会保持标签码在视觉中间左右运动&#xff0c;在根据物体在摄像头成像近大远小的原理根据这一特性&#xff0c;从而实现标签码跟随功能。 2. 启…

matlab编写分段Hermite插值多项式

文章目录 原理使用分段Hermite插值多项式原因公式第一类的两个插值积函数第二类的两个插值积函数 例题法一法二 代码分段 Hermite 插值的思路&#xff1a;分段 Hermite 插值多项式的构造&#xff1a;MATLAB 实现代码&#xff1a;结果如图&#xff1a;注归一化变量的作用&#x…

小米路由器IPv6 功能使用指南

本文不限于多层路由使用IPv6 的情况&#xff0c;提供解决IPv6 无法获取的更硬核的方法&#xff0c;需要有ssh 工具。&#xff08;无安卓设备&#xff0c;测试环境win、mac、ios&#xff09; 首先明确一点&#xff0c;就是如果想让你的设备得到GUA 地址&#xff0c;即访问 6.i…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

国产编辑器EverEdit - 扩展脚本:关闭所有未修改文档

1 扩展脚本&#xff1a;关闭所有未修改文档 1.1 应用场景 当用户打开过多文档时&#xff0c;部分文档已经修改&#xff0c;而大部分没有修改&#xff0c;为了减少在众多已打开文档中来回跳转的不便&#xff0c;可以将没有修改的文档全部关闭&#xff0c;但目前提供的快速关闭窗…

IIS部署.NetCore/.Net8/.Net9项目(从装环境到配置Swagger)

一、介绍 随着.NetCore开源、以及版本的更新迭代&#xff0c;.NetCore的性能越来越好、功能也越来越丰富&#xff0c;作为纯后端提供Api已经变得越来越频繁&#xff0c;与之配套的接口组件Swagger也成为很多人的选择。下面介绍在IIS上部署Swagger的详细过程。 二、安装IIS服务…