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

    img

    img

    img

    img

    二、在Controller层访问HttpContext

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

    Controller父类中继承与ControllerBase抽象类

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

    img

    所以,我们在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. 将复制的数据传递给后台任务。

    img

    六、在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

    分享给大家。

  • 相关阅读:
    convert image to base64 and post to RESTful wcf
    在android webview实现截屏的手动tounchmove裁剪图片
    How to use jquery ajax and android request security RESTful WCF
    using swfUpload in asp.net mvc
    using HttpClient and sending json data to RESTful server in adroind
    ODP.NET数据访问
    android image watermark
    解决国内不能访问github的问题
    idapro权威指南第二版阅读笔记第九章 交叉引用和绘图功能
    idapro权威指南第二版阅读笔记第二章 逆向和反汇编工具
  • 原文地址:https://www.cnblogs.com/Study-Csharp/p/12590848.html
Copyright © 2011-2022 走看看