ASP.NET의 HttpContext.Current 구현에 대응하는 ASP.NET Core의 IHttpContextAccessor/HttpContextAccessor 사용법
HttpContext.Current와 같은 구현이 왜 필요할까요?
가령 ASP.NET Core 프로젝트에서 별도의 라이브러리(DLL)를 참조해 현재 요청의 HOST 명을 반환하는 메서드를 구현한다고 가정해 보겠습니다. 만약 HttpContext.Current가 없다면 ASP.NET Core 측에서 명시적인 Request 객체를 다음과 같이 넘겨줘야만 합니다.
// asp.net core 측에서 호출할 때,
[HttpGet]
public IEnumerable<string> Get()
{
ClassLibrary1.Class1 cl = new ClassLibrary1.Class1();
return new string[] { cl.GetHost(this.Request) };
}
// 라이브러리 프로젝트에서 Request를 접근할 때,
using Microsoft.AspNetCore.Http;
using System;
namespace ClassLibrary1
{
public class Class1
{
public string GetHost(HttpRequest req)
{
return req.Host.ToString();
}
}
}
즉, 라이브러리에서 HttpRequest나 HttpResponse와 연관된 기능이 필요하다면 언제나 저렇게 명시적으로 객체를 넘겨줘야만 하는 것입니다.
그런데 이런 불편함을 기존 ASP.NET에서는 HttpContext.Current 객체를 이용해 해결했었습니다. 그리고 ASP.NET Core에서도 이와 유사한 역할을 하는 IHttpContextAccessor/HttpContextAccessor 타입을 제공해 주고 있는데,
The IHttpContextAccessor service is not registered by default
; https://github.com/aspnet/Announcements/issues/190
How to get HttpContext.Current in ASP.NET Core? [duplicate]
; https://stackoverflow.com/questions/38571032/how-to-get-httpcontext-current-in-asp-net-core
사용을 위해 ConfigureServices에서 다음과 같이 추가해 줘야 합니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
이것을 사용하면 이전에 구현한 GetHost 메서드를 다음과 같이 바꿀 수 있습니다.
using Microsoft.AspNetCore.Http;
using System;
namespace ClassLibrary1
{
public class Class1
{
public string GetHost()
{
HttpContextAccessor hca = new HttpContextAccessor();
return hca.HttpContext.Request.Host.ToString();
}
}
}
첨부 파일은 이 글의 예제 코드를 포함합니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]