Advanced - Access HttpContext
In this article
HttpContext
from Razor Pages
Access public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
HttpContext
from a Razor view in MVC
Access @{
var username = Context.User.Identity.Name;
// ...
}
HttpContext
from a controller
Access public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
HttpContext
from minimal APIs
Access app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
HttpContext
from middleware
Access public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
HttpContext
from SignalR
Access public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
HttpContext
from gRPC methods
Access HttpContext
from custom components
Access var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
-
UserRepository
declares its dependency onIHttpContextAccessor
. -
The dependency is supplied when DI resolves the dependency chain and creates an instance of
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;
// ...
}
}
HttpContext
access from a background thread
Note If your app generates sporadic
NullReferenceException
errors, review parts of the code that start background processing or that continue processing after a request completes. Look for mistakes, such as defining a controller method asasync void
.
-
Copy the required data during request processing.
-
Pass the copied data to a background task.
-
Do not reference
HttpContext
data in parallel tasks. Extract the data needed from the context before starting the parallel tasks.
public class EmailController : Controller
{
public IActionResult SendEmail(string email)
{
var correlationId = HttpContext.Request.Headers["X-Correlation-Id"].ToString();
_ = SendEmailCoreAsync(correlationId);
return View();
}
private async Task SendEmailCoreAsync(string correlationId)
{
// ...
}
}
IHttpContextAccessor
/HttpContext in Razor components (Blazor)
[CascadingParameter]
public HttpContext? HttpContext { get; set; }