将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访问的正确姿势的更多相关文章

  1. HttpContext访问的正确姿势

    本文章转发自:https://www.cnblogs.com/tianqing/p/12570801.html 使用HttpContext的具体场景: 1. 在Controller层访问HttpCon ...

  2. .NET Core技术研究系列-索引篇

    随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...

  3. .NET Core技术研究-主机

    前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...

  4. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

  5. .NET Core技术研究-中间件的由来和使用

    我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件.  ...

  6. ASP.NET Core技术研究-探秘Host主机启动过程

    当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.P ...

  7. .Net Core技术研究-Span<T>和ValueTuple<T>

    性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一.方法的多个返回值的实现,看ValueTuple<T> ...

  8. ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  9. .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量

    随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...

随机推荐

  1. numpy的基础运算1

    import numpy as np #int16和int32内存少,int64内存大但精度高 a = np.array([1,23,4],dtype=np.int32) b = np.zeros(( ...

  2. Redis 安装及入门

    Redis简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Docker方式安装Redis # 拉取 r ...

  3. 手术Robot能取代医生吗?

    现在,机械自动化已经成为各领域为之神往的大趋势,从工业组装,到智能物流,再到餐饮.银行服务,以及娱乐等等,管理者无不处心积虑地降低成本.提高效率,其中,一个非常重要的手段就是利用机器取代人工.医院,作 ...

  4. 查漏补缺:QT入门

    1.什么世QT Qt是一个跨平台的C++图形用户界面应用程序框架,为应用程序开发者提供建立艺术级图形界面所需的所有功能.它是完全面向对象的,容易扩展,并且允许真正的组建编程. 2.支持平台 Windo ...

  5. 万达乐园VS阿里帝国 谁将是未来娱乐产业的龙头?

    国内实体行业大佬王健林和互联网行业巨头马云,这次又不约而同地想到一块去了.从王健林叫板迪士尼大搞借势营销,到最近马云成立大文娱工作领导小组,明显的趋势表明娱乐越来越成为各界大佬们未来掘金的新战场.只不 ...

  6. 安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)

    针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具. SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件.因此所以,就算用户兴奋起来,狂按按钮播放全部音频, ...

  7. vim 编辑器技巧 打开多窗口编辑 vsp

    我有两个配置文件 [root@gameserver1 conf]# ls auth_1.json auth_2.json 先打开auth_2.json 在vim编辑器中打开auth_1.json,在打 ...

  8. 一篇文章带您读懂Map集合(源码分析)

    今天要分享的Java集合是Map,主要是针对它的常见实现类HashMap进行讲解(jdk1.8) 什么是Map核心方法源码剖析1.文档注释2.成员变量3.构造方法4.put()5.get() 什么是M ...

  9. 课题:html5图像羽化(不规则区域羽化,feather,html5羽化)

    下午搜索了一堆相关文章,没有找到符合要求的. 对一张图片应用不规则区域的羽化,该怎么做呢? 首先去查了下 羽化的原理,然而没有什么用, 然后就开始从表现层去研究怎么模拟? idea 1: blur滤镜 ...

  10. SQL数据库中的增删改查总结1

    一.增:有2种方法 1.使用insert插入单行数据: 语法:insert [into]<表名> [列名] values <列值> 例:insert into Strdents ...