将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. staruml百度网盘下载

    分享staruml官方百度网盘下载 下载时间:2019年9月4日 21:27:37  StarUML(简称SU),是一种创建UML类图,生成类图和其他类型的统一建模语言(UML)图表的工具.StarU ...

  2. SpringMVC之请求响应(上)

    1.OutPutController package com.tz.controller; import java.util.Map; import org.springframework.stere ...

  3. 在python中使用json

    在服务器和客户端的数据交互的时候,要找到一种数据格式,服务端好处理,客户端也好处理,这种数据格式应该是一种统一的标准,不管在哪里端处理起来都是统一的,现在这种数据格式非常的多,比如最早的xml,再后来 ...

  4. Mac系列萎靡 大棒能否敲醒苹果?

    大棒能否敲醒苹果?" title="Mac系列萎靡 大棒能否敲醒苹果?">     iPhone在智能手机市场中的一骑绝尘,不断将苹果推向神坛位置.即使新品更新幅度 ...

  5. e代驾狂野裁员 O2O逐渐恢复理智?

    O2O逐渐恢复理智?" title="e代驾狂野裁员 O2O逐渐恢复理智?">     近段时间以来,O2O行业堪称"哀鸿遍野",十分凄惨.巨头 ...

  6. 海洋深处的数据中心——微软Natick项目

    数据中心(data center)是云计算的支柱,云计算的蓬勃发展离不开数据中心在建造运营方面的不断创新.但云端数据中心的运行过程中会产生大量热量,冷却降温过程则意味着巨大的能源消耗,这意味着需要庞大 ...

  7. python常用魔术方法概览

    构造和初始化 __init__(self, args) 构造函数 __new__(cls) 传入的是类实例 __del__(self) 析构函数,调用 del cls 时会被调用 属性访问控制 __g ...

  8. shell 函数(特定的函数和脚本内传参)

    和其他脚本语言一样,bash同样支持函数.我们可创建特定的函数,也可以创建能够接受参数的函数.需要的时候直接调用就可以了. 1.定义函数 function fname() { statements; ...

  9. 从头认识js-js的发展历史

    JavaScript简介 JavaScript诞生于1995年,当时,它的主要目的是处理以前有服务端语言(如Perl)负责的一些输入验证操作. JavaScript简史 1995年2月当时就职于Net ...

  10. 用table类型布局一个新闻网页

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...