在ASP.NET Core5.0中訪問HttpContext的方法步驟
ASP.NET Core 應用通過 IHttpContextAccessor 介面及其預設實現 HttpContextAccessor 訪問 HttpContext。 只有在需要訪問服務內的 HttpContext 時,才有必要使用 IHttpContextAccessor。
通過 Razor Pages 使用 HttpContext
Razor Pages PageModel 公開 HttpContext 屬性:
public class AboutModel : PageModel { public string Message { get; set; } public void OnGet() { Message = HttpContext.Request.PathBase; } }
通過 Razor 檢視使用 HttpContext
Razor 檢視通過檢視上的 RazorPage.Context 屬性直接公開 HttpContext。 下面的示例使用 Windows 身份驗證檢索 Intranet 應用中的當前使用者名稱:
@{ var username = Context.User.Identity.Name; ... }
通過控制器使用 HttpContext
控制器公開 ControllerBase.HttpContext 屬性:
public class HomeController : Controller { public IActionResult About() { var pathBase = HttpContext.Request.PathBase; ... return View(); } }
通過中介軟體使用 HttpContext
使用自定義中介軟體元件時,HttpContext 傳遞到 Invoke 或 InvokeAsync 方法,在中介軟體配置後可供訪問:
public class MyCustomMiddleware { public Task InvokeAsync(HttpContext context) { ... } }
通過自定義元件使用 HttpContext
對於需要訪問 HttpContext 的其他框架和自定義元件,建議使用內建的依賴項注入容器來註冊依賴項。 依賴項注入容器向任意類提供 IHttpContextAccessor,以供類在自己的建構函式中將它宣告為依賴項:
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddHttpContextAccessor(); services.AddTransient<IUserRepository,UserRepository>(); }
如下示例中:
- UserRepository 宣告自己對 IHttpContextAccessor 的依賴。
- 當依賴項注入容器解析依賴鏈並建立 UserRepository 例項時,就會注入依賴 項。
public class UserRepository : IUserRepository { private readonly IHttpContextAccessor _httpContextAccessor; public UserRepository(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public void LogCurrentUser() { var username = _httpContextAccessor.HttpContext.User.Identity.Name; service.LogAccessRequest(username); } }
從後臺執行緒訪問 HttpContext
HttpContext 不是執行緒安全型。 在處理請求之外讀取或寫入 HttpContext 的屬性可能會導致 NullReferenceException。
要使用 HttpContext 資料安全地執行後臺工作,請執行以下操作:
- 在請求處理過程中複製所需的資料。
- 將複製的資料傳遞給後臺任務。
要避免不安全程式碼,請勿將 HttpContext 傳遞給執行後臺工作的方法。 而是傳遞所需要的資料。 在以下示例中,呼叫 SendEmailCore,開始傳送電子郵件。 將 correlationId 傳遞到 SendEmailCore,而不是 HttpContext。 程式碼執行不會等待 SendEmailCore 完成:
public class EmailController : Controller { public IActionResult SendEmail(string email) { var correlationId = HttpContext.Request.Headers["x-correlation-id"].ToString(); _ = SendEmailCore(correlationId); return View(); } private async Task SendEmailCore(string correlationId) { ... } }
到此這篇關於在ASP.NET Core5.0中訪問HttpContext的方法步驟的文章就介紹到這了,更多相關ASP.NET Core 訪問 HttpContext內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!