ASP.NET Core에서 액세스 HttpContext
참고 항목
이 문서의 최신 버전은 아닙니다. 현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.
Important
이 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.
현재 릴리스는 이 문서의 .NET 9 버전을 참조 하세요.
HttpContext은 개별 HTTP 요청 및 응답에 대한 모든 정보를 캡슐화합니다.
HttpContext
인스턴스는 HTTP 요청을 수신할 때 초기화됩니다.
HttpContext
인스턴스는 Web API 컨트롤러, Razor Pages, SignalR, gRPC 등과 같은 미들웨어 및 앱 프레임워크에서 액세스할 수 있습니다.
HTTP 요청 및 응답과 함께 HttpContext
를 사용하는 방법에 대한 자세한 내용은 ASP.NET Core HttpContext 사용을 참조하세요.
페이지에서 HttpContext
액세스 Razor
Razor Pages PageModel은 PageModel.HttpContext 속성을 공개합니다.
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
해당 Razor 페이지 보기에서 같은 속성을 사용할 수 있습니다.
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
MVC의 HttpContext
보기에서 액세스 Razor
MVC 패턴의 Razor 보기는 이 보기에서 HttpContext
속성을 통해 RazorPage.Context를 공개합니다. 다음 예제에서는 Windows 인증을 사용하여 인트라넷 앱에서 현재 사용자 이름을 검색합니다.
@{
var username = Context.User.Identity.Name;
// ...
}
컨트롤러에서 액세스 HttpContext
컨트롤러는 ControllerBase.HttpContext 속성을 노출합니다.
public class HomeController : Controller
{
public IActionResult About()
{
var pathBase = HttpContext.Request.PathBase;
// ...
return View();
}
}
최소 API에서 액세스 HttpContext
최소 API에서 HttpContext
를 사용하려면 HttpContext
매개 변수를 추가합니다.
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));
미들웨어에서 액세스 HttpContext
사용자 지정 미들웨어 구성 요소에서 HttpContext
를 사용하려면 HttpContext
또는 Invoke
메서드에 전달된 InvokeAsync
매개 변수를 사용합니다.
public class MyCustomMiddleware
{
// ...
public async Task InvokeAsync(HttpContext context)
{
// ...
}
}
다음에서 액세스 HttpContext
SignalR
HttpContext
에서 SignalR를 사용하려면 GetHttpContext에서 Hub.Context 메서드를 호출합니다.
public class MyHub : Hub
{
public async Task SendMessage()
{
var httpContext = Context.GetHttpContext();
// ...
}
}
gRPC 메서드에서 액세스 HttpContext
gRPC 메서드에서 사용 HttpContext
하려면 gRPC 메서드의 Resolve HttpContext
를 참조하세요.
사용자 지정 구성 요소에서 액세스 HttpContext
HttpContext
에 액세스해야 하는 기타 프레임워크 및 사용자 지정 구성 요소의 경우 기본 제공 DI(종속성 주입) 컨테이너를 사용하여 종속성을 등록하는 것이 좋습니다. DI 컨테이너는 IHttpContextAccessor
를 해당 생성자에서 종속성으로 선언하는 모든 클래스에 이를 제공합니다.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddHttpContextAccessor();
builder.Services.AddTransient<IUserRepository, UserRepository>();
다음 예제에서
-
UserRepository
는IHttpContextAccessor
에 대한 종속성을 선언합니다. - DI가 종속성 체인을 확인하고
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
백그라운드 스레드에서 액세스
HttpContext
은(는) 스레드로부터 안전하지 않습니다. 요청을 처리하지 않고 HttpContext
의 속성을 읽거나 쓰면 NullReferenceException이 나타날 수 있습니다.
참고 항목
앱에서 드물게 발생하는 NullReferenceException
오류를 생성하는 경우 백그라운드 처리를 시작하거나 요청이 완료된 후 처리를 계속하는 코드의 일부를 검토합니다. 컨트롤러 메서드를 async void
로 정의하는 것과 같은 오류를 찾습니다.
HttpContext
데이터로 백그라운드 작업을 안전하게 수행하려면
- 요청 처리 중에 필요한 데이터를 복사합니다.
- 복사된 데이터를 백그라운드 작업에 전달합니다.
- 병렬 작업에서 데이터를 참조하지
HttpContext
. 병렬 작업을 시작하기 전에 컨텍스트에서 필요한 데이터를 추출합니다.
안전하지 않은 코드를 방지하려면 백그라운드 작업을 수행하는 메서드에 HttpContext
를 전달하지 마세요. 필요한 데이터를 대신 전달하세요. 다음 예제에서는 이메일 보내기를 시작하기 위해 SendEmail
이 SendEmailCoreAsync
를 호출합니다.
X-Correlation-Id
헤더의 값이 SendEmailCoreAsync
대신 HttpContext
에 전달됩니다.
SendEmailCoreAsync
이(가) 완료될 때까지 코드 실행이 대기하지 않습니다.
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
구성 요소에서 Razor (Blazor)
자세한 내용은 ASP.NET Core Blazor 앱 에서 IHttpContextAccessor/HttpContext를 참조하세요.
HttpContext은 개별 HTTP 요청 및 응답에 대한 모든 정보를 캡슐화합니다.
HttpContext
인스턴스는 HTTP 요청을 수신할 때 초기화됩니다.
HttpContext
인스턴스는 Web API 컨트롤러, Razor Pages, SignalR, gRPC 등과 같은 미들웨어 및 앱 프레임워크에서 액세스할 수 있습니다.
HTTP 요청 및 응답과 함께 HttpContext
를 사용하는 방법에 대한 자세한 내용은 ASP.NET Core HttpContext 사용을 참조하세요.
페이지에서 HttpContext
액세스 Razor
Razor Pages PageModel은 PageModel.HttpContext 속성을 공개합니다.
public class IndexModel : PageModel
{
public void OnGet()
{
var message = HttpContext.Request.PathBase;
// ...
}
}
해당 Razor 페이지 보기에서 같은 속성을 사용할 수 있습니다.
@page
@model IndexModel
@{
var message = HttpContext.Request.PathBase;
// ...
}
MVC의 HttpContext
보기에서 액세스 Razor
MVC 패턴의 Razor 보기는 이 보기에서 HttpContext
속성을 통해 RazorPage.Context를 공개합니다. 다음 예제에서는 Windows 인증을 사용하여 인트라넷 앱에서 현재 사용자 이름을 검색합니다.
@{
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
에 액세스해야 하는 기타 프레임워크 및 사용자 지정 구성 요소의 경우 기본 제공 DI(종속성 주입) 컨테이너를 사용하여 종속성을 등록하는 것이 좋습니다. DI 컨테이너는 IHttpContextAccessor
를 해당 생성자에서 종속성으로 선언하는 모든 클래스에 이를 제공합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddHttpContextAccessor();
services.AddTransient<IUserRepository, UserRepository>();
}
다음 예제에서
-
UserRepository
는IHttpContextAccessor
에 대한 종속성을 선언합니다. - DI가 종속성 체인을 확인하고
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이 나타날 수 있습니다.
참고 항목
앱에서 드물게 발생하는 NullReferenceException
오류를 생성하는 경우 백그라운드 처리를 시작하거나 요청이 완료된 후 처리를 계속하는 코드의 일부를 검토합니다. 컨트롤러 메서드를 async void
로 정의하는 것과 같은 오류를 찾습니다.
HttpContext
데이터로 백그라운드 작업을 안전하게 수행하려면
- 요청 처리 중에 필요한 데이터를 복사합니다.
- 복사된 데이터를 백그라운드 작업에 전달합니다.
- 병렬 작업에서 데이터를 참조하지
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)
{
// ...
}
}
IHttpContextAccessor
/
HttpContext
구성 요소에서 Razor (Blazor)
ASP.NET Core Blazor 앱 에서 IHttpContextAccessor 및 HttpContext에 대한 자세한 내용은참조하세요.
ASP.NET Core