HttpContext訪問的正確姿勢


本文章轉發自:https://www.cnblogs.com/tianqing/p/12570801.html

使用HttpContext的具體場景:

1. 在Controller層訪問HttpContext

2. 在中間件中使用HttpContext

3. 在數據訪問層使用HttpContext

4. 在后台線程中訪問HttpContext

5. 在Razor頁面模型中訪問HttpContext

6. 在Razor視圖中訪問HttpContext

解決方案

1.在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的訪問,如下代碼:

六、在Razor視圖中訪問HttpContext

   Razor 視圖通過視圖上的 RazorPage.Context 屬性直接公開 HttpContext

@{
    ViewData["Title"] = "Home Page";
    var username = Context.User.Identity.Name;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM