.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应用程序

  

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

  

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

  

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

  

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

  二、在Controller层访问HttpContext

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

  Controller父类中继承与ControllerBase抽象类

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

  

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

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

  1 public class HomeController : Controller

  2 {

  3 private readonly ILogger _logger;

  4 private string customer;

  5

  6 public HomeController(ILogger logger)

  7 {

  8 _logger=logger;

  9

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

  11 }

  12 }

  三、在中间件中使用HttpContext

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

  public async Task Invoke(HttpContext context)

  1 public class CustomerMiddleware

  2 {

  3 private readonly RequestDelegate _next;

  4

  5 public CustomerMiddleware(RequestDelegate next)

  6 {

  7 _next=next;

  8 }

  9

  10 public async Task Invoke(HttpContext context)

  11 {

  12 // Do something with context near the beginning of request processing.

  13 await _next.Invoke(context);

  14

  15 // Clean up.

  16 }

  17 }

  四. 在数据访问层使用HttpContext

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

  UserRepository依赖 IHttpContextAccessor

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

  1 public class UserRepository: IUserRepository

  2 {

  3 private readonly IHttpContextAccessor _httpContextAccessor;

  4

  5 public UserRepository(IHttpContextAccessor httpContextAccessor)

  6 {

  7 _httpContextAccessor=httpContextAccessor;

  8 }

  9

  10 public void AddUser(User user)

  11 {

  12 var username=_httpContextAccessor.HttpContext.User.Identity.Name;

  13

  14 //Save User to DB

  15 }

  16 }

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

  public void ConfigureServices(IServiceCollection services)

  {

  services.AddControllersWithViews();

  services.AddHttpContextAccessor();

  services.AddTransient();

  }

  五、在后台线程中访问HttpContext

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

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

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

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

  

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

  六、在Razor页面模型中访问HttpContext

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

  1 public class UserModel: PageModel

  2 {

  3 public string Message { get; set; }

  4

  5 public void OnGet()

  6 {

  7 Message=HttpContext.Request.PathBase;

  8 }

  9 }

  七、 在Razor视图中访问HttpContext

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

  @{

  ViewData["Title"]="Home Page";

  var username=Context.User.Identity.Name;

  }

  以上是近期总结的6种HttpContext访问的正确姿势。详细参考了以下链接:

  docs.microsoft/zh-cn/aspnet/core/fundamentals/http-context?view=aspnetcore-3.1

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值