.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页面模型中访问HttpContext
6. 在Razor视图中访问HttpContext
可能还有其他的应用场景。接下来我们按场景一一示例解决。
首先本文用的是ASP.NET Core 3.1
一、新建一个ASP.NET Core Web应用程序
二、在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的访问,如下代码:
public class UserModel: PageModel
{
public string Message { get; set; } public void OnGet()
{
Message = HttpContext.Request.PathBase;
}
}
七、 在Razor视图中访问HttpContext
Razor 视图通过视图上的 RazorPage.Context 属性直接公开 HttpContext
@{
ViewData["Title"] = "Home Page";
var username = Context.User.Identity.Name;
}
以上是近期总结的6种HttpContext访问的正确姿势。详细参考了以下链接:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-context?view=aspnetcore-3.1
分享给大家。
周国庆
2020/3/25
.NET Core技术研究-HttpContext访问的正确姿势的更多相关文章
- HttpContext访问的正确姿势
本文章转发自:https://www.cnblogs.com/tianqing/p/12570801.html 使用HttpContext的具体场景: 1. 在Controller层访问HttpCon ...
- .NET Core技术研究系列-索引篇
随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...
- .NET Core技术研究-主机
前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...
- ASP.NET Core技术研究-全面认识Web服务器Kestrel
因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...
- .NET Core技术研究-中间件的由来和使用
我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件. ...
- ASP.NET Core技术研究-探秘Host主机启动过程
当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.P ...
- .Net Core技术研究-Span<T>和ValueTuple<T>
性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一.方法的多个返回值的实现,看ValueTuple<T> ...
- ASP.NET Core技术研究-探秘依赖注入框架
ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...
- .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量
随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...
随机推荐
- Jmeter之Beanshell---使用Java处理JSON块
原文出处:https://www.cnblogs.com/xpp142857/p/7374281.html [环境] ①Jmeter版本:3.1,JDK:1.7 ②前置条件:将json.jar包置于. ...
- 我们为什么不愿意相信AI?
人工智能--即AI已经变得越来越聪明,甚至能够预测未来.比如警察可以用AI来提前预判出犯罪的时间或地点,医生可以用AI预测病人最有可能心脏病发作或是中风.甚至研究人员还试图为AI添加上更多的想象力,因 ...
- mac下配置开发环境
常用命令 显示隐藏文件 1 defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder 关闭隐藏文 ...
- 当async: true 时,ajax请求是异步的
方法beforeSend,用于在向服务器发送请求前添加一些处理函数. type:"GET",//通常会用到两种:GET,POST.默认是:GET url:" ...
- “淘宝技术这十年”
"少时淘气,大时淘宝" 时势造英雄 起因eBay 易趣 在资本方面对仗,阿里想趁此崛起新项目就要求能在短时间内做出一个 个人对个人的商品交易网站(C2C)2003年4月7日-5月1 ...
- 腾讯自动化测试的AI智能
引子: 本文是林奕在腾讯 DevDays 2018 分享内容的脱敏整理,介绍了 CSIG 测试开发中心(前 SNG 测试开发中心)在自动化测试领域所做的智能化尝试. 大致分成下面几部分: 使用AI面对 ...
- redis笔记之一
NoSQL简介 全称是Not Only SQL,泛指菲关系型数据库,它是通过键值对存储数据并且将数据存储在内存中.而像mysql,sql server这些通过关系表存数据的就叫关系型数据库 为什么需要 ...
- 印度IT产业今年裁员5.6万,自动化大潮下安有完卵
[腾讯科技编者按]业界媒体Quatz撰文指出,对于印度科技从业者来说,2017年是噩梦连连的一年.直到几年前,IT业都还是印度提供就业岗位最多的行业之一,但在今年,这个1600亿美元规模的行业裁掉了5 ...
- git基本命令(二)
忽略文件 git可以将用户指定的文件或者目录排除在版本之外,它会检查代码仓库目录下是否存在名为.gitignore文件,如果存在就会一行一行读取这个文件的内容,会将每一行指定的文件或目录排除 ...
- TCP传输连接管理
TCP传输连接管理 一.传输连接的三个阶段 1.1.概述 传输连接就有三个阶段,即:连接建立.数据传送和连接释放. 连接建立过程中要解决以下三个问题: 要使每一方能够确知对方的存在. 要允许双方协商一 ...