ASP.NET을 ASP.NET Core로 업그레이드한 후 HttpContext.Current 사용이 불가능해지는 문제를 경험한 분들이 많을 것입니다. 이 문제를 해결하기 위해 ASP.NET Core에서 HttpContext를 접근하는 올바른 방법을 알아보겠습니다.
이 문서에서는 HttpContext를 사용하는 다양한 장면을 설명하고 각각의 해결 방법을示例로 제공합니다.
1. Controller에서 HttpContext 접근
Controller는 ControllerBase 추상 클래스를 상속받으며 이 클래스는 HttpContext에 대한 액세스를 제공합니다. HomeController 예제에서 확인할 수 있습니다:
public class UserController : Controller
{
private readonly ILogger<UserController> _logger;
private string userId;
public UserController(ILogger<UserController> logger)
{
_logger = logger;
userId = HttpContext.Request.Form["userId"];
}
}
2. Middleware에서 HttpContext 사용
커스텀 미들웨어에서 HttpContext는 Invoke 메서드의 매개변수로 전달됩니다:
public class CustomMiddleware
{
private readonly RequestDelegate _next;
public CustomMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
// 요청 처리 시작 부분에 작업 수행
await _next.Invoke(context);
// 정리 작업 수행
}
}
3. 데이터 액세스 계층에서 HttpContext 사용
UserRepository 예제에서 IHttpContextAccessor를 통해 HttpContext에 액세스합니다:
public class UserRepository : IUserRepository
{
private readonly IHttpContextAccessor _httpContextAccessor;
public UserRepository(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
public void AddUser(User user)
{
var username = _httpContextAccessor.HttpContext.User.Identity.Name;
// 데이터베이스에 유저 저장
}
}
4. 요청 외부에서 HttpContext 사용
HttpContext는 스레드가 안전하지 않습니다. 이 문제를 해결하기 위해 요청 처리 중에 필요한 데이터를 복사하고 배경 작업에 전달해야 합니다.
5. Razor 페이지 모델에서 HttpContext 접근
Razor 페이지 모델은 HttpContext에 접근할 수 있는 기반 클래스를 상속합니다:
public class UserProfileModel : PageModel
{
public string Message { get; set; }
public void OnGet()
{
Message = HttpContext.Request.PathBase;
}
}
6. Razor 보기에서 HttpContext 접근
Razor 보기에서는 Context 속성 통해 HttpContext에 접근할 수 있습니다:
@{
ViewData["Title"] = "홈 페이지";
var username = Context.User.Identity.Name;
}
이상은 HttpContext를 접근하는 6가지 방법입니다. 더 많은 정보는 Microsoft 문서를 참고하시기 바랍니다.