本文章轉發自: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; }