在 ASP.NET Core 5.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)    {        ...    }}
 

 關注公眾號:UP技術控   獲取更多資訊


免責聲明!

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



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