HttpContext访问的正确姿势

本文章转发自:https://www.cnblogs.com/tianqing/p/12570801.html

使用HttpContext的具体场景:

1. 在Controller层访问HttpContext

2. 在中间件中使用HttpContext

3. 在数据访问层使用HttpContext

4. 在后台线程中访问HttpContext

5. 在Razor页面模型中访问HttpContext

6. 在Razor视图中访问HttpContext

解决方案

1.在Controller层访问HttpContext

示例代码中HomeController继承与Controller抽象类

Controller父类中继承与ControllerBase抽象类

其中ControllerBase抽象类有提供了对HttpContext的访问

所以,我们在Controller这一层可以按以下方式访问HttpContext:

public class HomeController : Controller
  {
        private readonly ILogger<HomeController> _logger;
        private string customer;

        public HomeController(ILogger<HomeController> logger)
        {
            _logger = logger;

            customer = HttpContext.Request.Form["CustomerId"];
        }
}

 二:在中间件中使用HttpContext

自定义扩展中间件中,实现Invoke方法,HttpContext通过参数的方式传递到中间件的业务逻辑中。

 public async Task Invoke(HttpContext context)

 

public class CustomerMiddleware
{
        private readonly RequestDelegate _next;

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

        public async Task Invoke(HttpContext context)
        {
            // Do something with context near the beginning of request processing.
            await _next.Invoke(context);

            // Clean up.
        }
}

三、 在数据访问层使用HttpContext

声明一个User的仓储类,实现对User的持久化。如下代码中,

UserRepository依赖 IHttpContextAccessor

通过ASP.NET Core依赖注入容器解析依赖链并创建 UserRepository 实例时,就会注入依赖项。

public class UserRepository: IUserRepository
    {
        private readonly IHttpContextAccessor _httpContextAccessor;

        public UserRepository(IHttpContextAccessor httpContextAccessor)
        {
            _httpContextAccessor = httpContextAccessor;
        }

        public void AddUser(User user)
        {
            var username = _httpContextAccessor.HttpContext.User.Identity.Name;

            //Save User to DB
        }
    }

使用ASP.NET Core内置的依赖项注入容器来注册依赖项。 依赖项注入容器向任意类提供 IHttpContextAccessor,以供类在自己的构造函数中将它声明为依赖项:

public void ConfigureServices(IServiceCollection services)
{
            services.AddControllersWithViews();

            services.AddHttpContextAccessor();
            services.AddTransient<IUserRepository, UserRepository>();
}

四:在后台线程中访问HttpContext

HttpContext 不是线程安全的。 在处理请求之外读取或写入 HttpContext 的属性,可能会导致 NullReferenceException空引用异常。

如何再后台线程中使用HttpContext呢?推荐的做法:

1. 在请求处理过程中复制所需的数据。

2. 将复制的数据传递给后台任务。

五:在Razor页面模型中访问HttpContext

Razor页面模型的父类PageModel提供了HttpContext的访问,如下代码:

六、在Razor视图中访问HttpContext

Razor 视图通过视图上的 RazorPage.Context 属性直接公开 HttpContext

@{
    ViewData["Title"] = "Home Page";
    var username = Context.User.Identity.Name;
}

原文地址:https://www.cnblogs.com/ITzhangyunpeng/p/12597605.html

时间: 2024-11-06 13:49:30

HttpContext访问的正确姿势的相关文章

.NET Core技术研究-HttpContext访问的正确姿势

将ASP.NET升级到ASP.NET Core之后,相信大家都会遇到HttpContext.Current无法使用的问题.这也是我们迁移ASP.NET Core必须解决的问题. 本文我们详细讨论一下,使用HttpContext的正确姿势. 先列一下使用HttpContext的具体场景: 1. 在Controller层访问HttpContext 2. 在中间件中使用HttpContext 3. 在数据访问层使用HttpContext 4. 在后台线程中访问HttpContext 5. 在Razor

[转].NET Core技术研究-HttpContext访问的正确姿势

将ASP.NET升级到ASP.NET Core之后,相信大家都会遇到HttpContext.Current无法使用的问题.这也是我们迁移ASP.NET Core必须解决的问题. 本文我们详细讨论一下,使用HttpContext的正确姿势. 先列一下使用HttpContext的具体场景: 1. 在Controller层访问HttpContext 2. 在中间件中使用HttpContext 3. 在数据访问层使用HttpContext 4. 在后台线程中访问HttpContext 5. 在Razor

访问天地图WMTS服务的正确姿势

天地图2018版对天地图应用开发流程进行了升级改造,主要有两点变化: (1)接口升级为tianditu.gov.cn政府域名,支持HTTP/HTTPS协议,原有服务域名tianditu.com继续保留: (2)自2019年1月1日起,天地图API及服务接口调用都需要获取开发授权. 这确实带来不便,所有涉及天地图的项目都得改,尤其是那些将喜欢叫参数写死在代码中同学. 访问天地图WMTS服务的正确姿势 原文地址:https://www.cnblogs.com/liweis/p/10632588.ht

使用 win10 的正确姿势 (第二版)

文章为本人原创,转载请注明出处,谢谢. 17年9月初,写了第一篇<使用 win10 的正确姿势>,而现在半年多过去,文章更新了一些,主要是桌面的变化. 一. 重新定义桌面 我的桌面: 将桌面定义为:临时文件夹.在桌面放置最近需要的文件,使用完毕后归类即可. 任务栏置于左侧:放置一些常用软件,文件,网页等等. 打开其他软件或文件:使用 Listary 这款软件,下文介绍. 小技巧:任务栏有一个搜索栏(win+Q 打开),是查找系统文件的神器.比如 IE.环境变量.程序和功能.截图工具.便利贴等等

CEPH L 版集群正确姿势

很多小伙伴在安装ceph集群的时候总会遇到各种各样的问题,今天就抽出时间来,给大家讲解一下ceph集群的安装的正确姿势,更多高级课程请访问:http://edu.51cto.com/center/course/index/search?q=朱丹阳 1.关闭selinux firewalld 2.添加本地localhost解析3.配置l版本的yum 源[ceph]name=cephenabled=1priority=1gpgcheck=1gpgkey=https://download.ceph.c

开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

前言首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息 参考. Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.日志服务等资源.它通过一个资源配置文件(template.yml),

开发函数计算的正确姿势 —— 爬虫

在 <函数计算本地运行与调试 - Fun Local 基本用法> 中,我们介绍了利用 Fun Local 本地运行.调试函数的方法.但如果仅仅这样简单的介绍,并不能展现 Fun Local 对函数计算开发的巨大效率的提升. 这一次,我们拿一个简单的场景来举例子--开发一个简单的爬虫函数(代码参考函数计算控制台模板),介绍如何以正确姿势,从零开始,开发一个自动伸缩.按调用次数收费的 serverless 爬虫应用. 开发步骤我们将这个完整的应用拆分成多步,并且在每一步完成后,我们都会进行相应的运

SpringBoot 开发案例之参数传递的正确姿势

前言 开发这么多年,肯定还有不少小伙伴搞不清各种类型的参数是如何传递的,很多同学都是拿来即用,复制粘贴一把撸,遇到问题还是一脸懵逼. 姿势 学习参数传递的正确姿势,先说怎么做,再说为什么,本质上还是复制粘贴一把撸,问题是你想问不想问为什么! 传递 用户登录 前端代码: var param = { "username": "admin", "password": "admin" } $.ajax({ url: "/sy

开发函数计算的正确姿势——轻松解决大依赖部署

<a name="1"></a> 前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费.函数计算更多信息 参考.Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算.API 网关.