다음을 통해 공유


ASP.NET Core에서 액세스 HttpContext

HttpContext은 개별 HTTP 요청 및 응답에 대한 모든 정보를 캡슐화합니다. HttpContext 인스턴스는 HTTP 요청을 수신할 때 초기화됩니다. HttpContext 인스턴스는 Web API 컨트롤러, Razor Pages, SignalR, gRPC 등과 같은 미들웨어 및 앱 프레임워크에서 액세스할 수 있습니다.

HTTP 요청 및 응답과 함께 HttpContext를 사용하는 방법에 대한 자세한 내용은 ASP.NET Core HttpContext 사용을 참조하세요.

페이지에서 Razor 액세스 HttpContext

Razor Pages PageModelPageModel.HttpContext 속성을 공개합니다.

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

해당 Razor 페이지 보기에서 같은 속성을 사용할 수 있습니다.

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

MVC의 Razor 보기에서 액세스 HttpContext

MVC 패턴의 Razor 보기는 이 보기에서 RazorPage.Context 속성을 통해 HttpContext를 공개합니다. 다음 예제에서는 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를 사용하려면 Invoke 또는 InvokeAsync 메서드에 전달된 HttpContext 매개 변수를 사용합니다.

public class MyCustomMiddleware
{
    // ...

    public async Task InvokeAsync(HttpContext context)
    {
        // ...
    }
}

다음에서 액세스 HttpContextSignalR

SignalR에서 HttpContext를 사용하려면 Hub.Context에서 GetHttpContext 메서드를 호출합니다.

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>();

다음 예제에서

  • UserRepositoryIHttpContextAccessor에 대한 종속성을 선언합니다.
  • 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를 전달하지 마세요. 필요한 데이터를 대신 전달하세요. 다음 예제에서는 이메일 보내기를 시작하기 위해 SendEmailSendEmailCoreAsync를 호출합니다. X-Correlation-Id 헤더의 값이 HttpContext 대신 SendEmailCoreAsync에 전달됩니다. 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)

IHttpContextAccessor 는 유효한 HttpContext 사용 가능한 렌더링이 없으므로 대화형 렌더링을 피해야 합니다.

IHttpContextAccessor 는 서버에서 정적으로 렌더링되는 구성 요소에 사용할 수 있습니다. 그러나 가능하면 피하는 것이 좋습니다.

HttpContext는 헤더 또는 구성 요소(Components/App.razor)의 다른 속성 검사 및 수정과 같은 일반적인 작업에 대해 정적으로 렌더링된 루트 구성 요소에서 App 만 연계 매개 변수로 사용할 수 있습니다. 이 값은 항상 null 대화형 렌더링을 위한 것입니다.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

대화형 구성 요소에 필요한 시나리오 HttpContext 의 경우 서버에서 영구 구성 요소 상태를 통해 데이터를 흐르는 것이 좋습니다. 자세한 내용은 서버 쪽 ASP.NET Core Blazor 추가 보안 시나리오를 참조하세요.

서버 쪽 Blazor 앱의 구성 요소에서 Razor 직접 또는 간접적으로 사용하지 IHttpContextAccessor/HttpContext 마세요. Blazor 앱은 ASP.NET Core 파이프라인 컨텍스트 외부에서 실행됩니다. IHttpContextAccessor 내에서의 HttpContext은 보장되지 않으며, Blazor 앱을 시작하는 컨텍스트 유지를 위해 HttpContext도 보장되지 않습니다.

앱에 요청 상태를 Blazor 전달하는 권장 방법은 앱의 초기 렌더링 중에 루트 구성 요소 매개 변수를 사용하는 것입니다. 또는 앱에서 사용할 루트 구성 요소의 초기화 수명 주기 이벤트에서 범위가 지정된 서비스로 데이터를 복사할 수 있습니다. 자세한 내용은 서버 쪽 ASP.NET Core Blazor 추가 보안 시나리오를 참조하세요.

서버 쪽 Blazor 보안의 중요한 측면은 회로가 설정된 후 Blazor 특정 시점에 지정된 회로에 연결된 사용자가 업데이트될 수 있지만 IHttpContextAccessor업데이트되지 않는다는 것입니다. 사용자 지정 서비스를 사용하여 이 상황을 해결하는 방법에 대한 자세한 내용은 서버 쪽 ASP.NET Core Blazor 추가 보안 시나리오를 참조하세요.

HttpContext은 개별 HTTP 요청 및 응답에 대한 모든 정보를 캡슐화합니다. HttpContext 인스턴스는 HTTP 요청을 수신할 때 초기화됩니다. HttpContext 인스턴스는 Web API 컨트롤러, Razor Pages, SignalR, gRPC 등과 같은 미들웨어 및 앱 프레임워크에서 액세스할 수 있습니다.

HTTP 요청 및 응답과 함께 HttpContext를 사용하는 방법에 대한 자세한 내용은 ASP.NET Core HttpContext 사용을 참조하세요.

페이지에서 Razor 액세스 HttpContext

Razor Pages PageModelPageModel.HttpContext 속성을 공개합니다.

public class IndexModel : PageModel
{
    public void OnGet()
    {
        var message = HttpContext.Request.PathBase;

        // ...
    }
}

해당 Razor 페이지 보기에서 같은 속성을 사용할 수 있습니다.

@page
@model IndexModel

@{
    var message = HttpContext.Request.PathBase;

    // ...
}

MVC의 Razor 보기에서 액세스 HttpContext

MVC 패턴의 Razor 보기는 이 보기에서 RazorPage.Context 속성을 통해 HttpContext를 공개합니다. 다음 예제에서는 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

사용자 지정 미들웨어 구성 요소를 사용하는 경우 HttpContextInvoke 또는 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>();
}

다음 예제에서

  • UserRepositoryIHttpContextAccessor에 대한 종속성을 선언합니다.
  • 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은(는) HttpContext이(가) 아닌, SendEmailCore에 전달됩니다. 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)

IHttpContextAccessor 는 유효한 HttpContext 사용 가능한 렌더링이 없으므로 대화형 렌더링을 피해야 합니다.

IHttpContextAccessor 는 서버에서 정적으로 렌더링되는 구성 요소에 사용할 수 있습니다. 그러나 가능하면 피하는 것이 좋습니다.

HttpContext는 헤더 또는 구성 요소(Components/App.razor)의 다른 속성 검사 및 수정과 같은 일반적인 작업에 대해 정적으로 렌더링된 루트 구성 요소에서 App 만 연계 매개 변수로 사용할 수 있습니다. 이 값은 항상 null 대화형 렌더링을 위한 것입니다.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

대화형 구성 요소에 필요한 시나리오 HttpContext 의 경우 서버에서 영구 구성 요소 상태를 통해 데이터를 흐르는 것이 좋습니다. 자세한 내용은 서버 쪽 ASP.NET Core Blazor 추가 보안 시나리오를 참조하세요.

서버 쪽 Blazor 앱의 구성 요소에서 Razor 직접 또는 간접적으로 사용하지 IHttpContextAccessor/HttpContext 마세요. Blazor 앱은 ASP.NET Core 파이프라인 컨텍스트 외부에서 실행됩니다. IHttpContextAccessor 내에서의 HttpContext은 보장되지 않으며, Blazor 앱을 시작하는 컨텍스트 유지를 위해 HttpContext도 보장되지 않습니다.

앱에 요청 상태를 Blazor 전달하는 권장 방법은 앱의 초기 렌더링 중에 루트 구성 요소 매개 변수를 사용하는 것입니다. 또는 앱에서 사용할 루트 구성 요소의 초기화 수명 주기 이벤트에서 범위가 지정된 서비스로 데이터를 복사할 수 있습니다. 자세한 내용은 서버 쪽 ASP.NET Core Blazor 추가 보안 시나리오를 참조하세요.

서버 쪽 Blazor 보안의 중요한 측면은 회로가 설정된 후 Blazor 특정 시점에 지정된 회로에 연결된 사용자가 업데이트될 수 있지만 IHttpContextAccessor업데이트되지 않는다는 것입니다. 사용자 지정 서비스를 사용하여 이 상황을 해결하는 방법에 대한 자세한 내용은 서버 쪽 ASP.NET Core Blazor 추가 보안 시나리오를 참조하세요.