Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)
(시리즈 글이 5개 있습니다.)
.NET Framework: 412. HttpContext.Current를 통해 이해하는 CallContext와 ExecutionContext
; https://www.sysnet.pe.kr/2/0/1608

.NET Framework: 727. ASP.NET의 HttpContext.Current 구현에 대응하는 ASP.NET Core의 IHttpContextAccessor/HttpContextAccessor 사용법
; https://www.sysnet.pe.kr/2/0/11440

.NET Framework: 989. HttpContextAccessor를 통해 이해하는 AsyncLocal<T>
; https://www.sysnet.pe.kr/2/0/12467

.NET Framework: 1075.  C# - ThreadPool의 스레드는 반환 시 ThreadStatic과 AsyncLocal 값이 초기화 될까요?
; https://www.sysnet.pe.kr/2/0/12701

.NET Framework: 1076. C# - AsyncLocal 기능을 CallContext만으로 구현하는 방법
; https://www.sysnet.pe.kr/2/0/12706




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

첨부 파일은 이 글의 예제 코드를 포함합니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 12/30/2020]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13989정성태8/8/20253199닷넷: 2352. C# - Windows S-mode 환경인지 체크하는 방법파일 다운로드1
13988정성태8/8/20253196오류 유형: 974. 비주얼 스튜디오 업데이트 시 잠김 파일 경고 - Visual Studio Standard Collector Service 150 (VSStandardCollectorService150)
13987정성태8/7/20252758닷넷: 2351. C# 14 - (6) event와 생성자에도 partial 메서드 적용파일 다운로드1
13986정성태8/6/20252336닷넷: 2350. C# 14 - (5) 람다 매개 변수에 접근자가 있는 경우에도 타입 생략 가능파일 다운로드1
13985정성태8/6/20252956오류 유형: 973. "wsl --install" 명령어 수행 시 "The server name or address could not be resolved"
13984정성태8/6/20252749Windows: 282. 윈도우 운영체제에 추가된 ssh 서버(Win32-OpenSSH)
13983정성태8/4/20252670오류 유형: 972. Microsoft.Data.SqlClient 6.1.0 버전부터 .NET 8 이상만 지원
13982정성태8/2/20252984개발 환경 구성: 753. CentOS 7 컨테이너 내에서 openssh 서버 호스팅
13981정성태8/1/20252530오류 유형: 971. CentOS 7에서 yum 사용 시 "Could not resolve host: mirrorlist.centos.org; Unknown error"
13980정성태7/31/20252639Linux: 119. eBPF - BPF_PROG_TYPE_CGROUP_SOCK 유형에서 정상 동작하지 않는 BPF_CORE_READ (2)
13979정성태7/30/20253122Linux: 118. eBPF - BPF_PROG_TYPE_CGROUP_SOCK 유형에서 정상 동작하지 않는 BPF_CORE_READ
13978정성태7/29/20252577오류 유형: 970. 파일 복사 시 "Data error (cyclic redundancy check). (0x80070017)" 에러
13977정성태7/28/20253040닷넷: 2349. C# 14 - (4) 문자열 리터럴을 utf-8 인코딩으로 저장파일 다운로드1
13976정성태7/25/20252932닷넷: 2348. C# - 카카오 카나나 모델 + Microsoft.ML.OnnxRuntimeGenAI 예제파일 다운로드1
13975정성태7/23/20252812닷넷: 2347. C# 14 - (3) 형식 인자가 없는 제네릭 타입의 nameof 지원파일 다운로드1
13974정성태7/22/20252996닷넷: 2346. C# 14 - (2) Span 타입과 배열 간의 암시적 형변환파일 다운로드1
13973정성태7/21/20253137닷넷: 2345. C# - 배열 및 Span의 공변성파일 다운로드1
13972정성태7/21/20252806닷넷: 2344. C#의 Identity conversion 의미파일 다운로드1
13971정성태7/17/20253032닷넷: 2343. C# 14 - (1) 속성 구문에서 문맥 키워드로 추가되는 field 예약어파일 다운로드1
13970정성태7/17/20252740닷넷: 2342. C# 14 - (취소된 글)
13969정성태7/17/20252696닷넷: 2341. snap으로 설치한 .NET 리눅스 실행 환경
13968정성태7/16/20252686오류 유형: 969. lddtree - TypeError: 'type' object is not subscriptable
13967정성태7/16/20253480오류 유형: 968. snap으로 설치한 "dotnet run" 실행 시 "undefined symbol: _dl_audit_symbind_alt, version GLIBC_PRIVATE" 오류
13966정성태7/15/20254069디버깅 기술: 223. WinDbg - .kframes 명령어
13965정성태7/11/20253218오류 유형: 967. 디버깅 모드로 실행 시 "Could not find file 'C:\Program Files\IIS Express\Oracle.DataAccess.Common.Configuration.Section.xsd'" 예외
13964정성태7/10/20254534닷넷: 2340. C# - Win32 Multimedia Timer 주기파일 다운로드1
1  [2]  3  4  5  6  7  8  9  10  11  12  13  14  15  ...