zoukankan      html  css  js  c++  java
  • .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:

     1  public class HomeController : Controller
     2   {
     3         private readonly ILogger<HomeController> _logger;
     4         private string customer;
     5 
     6         public HomeController(ILogger<HomeController> 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<IUserRepository, UserRepository>();
    }

     五、在后台线程中访问HttpContext

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

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

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

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

      

      六、在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访问的正确姿势。详细参考了以下链接:

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

      分享给大家。

    周国庆

    2020/3/25

      

  • 相关阅读:
    easy ui 表单ajax和from两种提交数据方法
    easy ui 下拉级联效果 ,下拉框绑定数据select控件
    easy ui 下拉框绑定数据select控件
    easy ui 异步上传文件,跨域
    easy ui 菜单和按钮(Menu and Button)
    HTTP 错误 404.3
    EXTJS4.2 后台管理菜单栏
    HTML 背景图片自适应
    easy ui 表单元素input控件后面加说明(红色)
    EXTJS 4.2 添加滚动条
  • 原文地址:https://www.cnblogs.com/tianqing/p/12570801.html
Copyright © 2011-2022 走看看