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){...}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/211777.html
標籤:.NET Core
上一篇:C#小白求解
