3.8 KiB
title | author | description | ms.author | ms.custom | ms.date | uid |
---|---|---|---|---|---|---|
Access HttpContext in ASP.NET Core | coderandhiker | Learn how to access HttpContext in ASP.NET Core. | riande | mvc | 07/27/2018 | fundamentals/httpcontext |
Access HttpContext in ASP.NET Core
ASP.NET Core apps access the HttpContext
through the IHttpContextAccessor interface and its default implementation HttpContextAccessor.
::: moniker range=">= aspnetcore-2.0"
Use HttpContext from Razor Pages
The Razor Pages PageModel exposes the HttpContext property:
public class AboutModel : PageModel
{
public string Message { get; set; }
public void OnGet()
{
Message = HttpContext.Request.PathBase;
}
}
::: moniker-end
Use HttpContext from a Razor view
IHttpContextAccessor
service access is provided to a Razor view via the @inject
directive. The following example retrieves the current username in an Intranet app using Windows Authentication:
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
@{
var username = HttpContextAccessor.HttpContext.User.Identity.Name;
}
Use HttpContext from a controller
Controllers expose the ControllerBase.HttpContext property:
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// Do something with the PathBase.
return View();
}
}
Use HttpContext from middleware
When working with custom middleware components, HttpContext
is passed into the Invoke
or InvokeAsync
method and can be accessed when the middleware is configured:
public class MyCustomMiddleware
{
public Task InvokeAsync(HttpContext context)
{
// Middleware initialization optionally using HttpContext
}
}
Use HttpContext from custom components
For other framework and custom components that require access to HttpContext
, the recommended approach is to register a dependency using the built-in dependency injection container. The dependency injection container supplies the IHttpContextAccessor
to any classes that declare it as a dependency in their constructors.
::: moniker range=">= aspnetcore-2.1"
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
::: moniker-end
::: moniker range="<= aspnetcore-2.0"
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddTransient<IUserRepository, UserRepository>();
}
::: moniker-end
In the preceding example:
UserRepository
declares its dependency onIHttpContextAccessor
.- The dependency is supplied when dependency injection 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;
service.LogAccessRequest(username);
}
}