본문 바로가기
프로그래밍/C#

ASP.NET Core HTTP 요청 처리 흐름 알아보기

by bantomak 2025. 4. 23.
반응형

ASP.NET Core 요청 처리 흐름 기본 구조

ASP.NET Core 미들웨어(Middleware) 구조는 파이프라인 기반이기 때문에, 미들웨어 > 컨트롤러 > 다시 미들웨어로 "되돌아오는 흐름"을 갖는다. 해당 흐름을 더 잘 이해하기 위해서 아래의 그림을 살펴보자. 가장 중요한 부분은 한번 지나갔던 미들웨어로 다시 되돌아온다는 것이다.

┌──────────────────────────────┐
│   클라이언트 요청 (HTTP)     │
└──────────────┬───────────────┘
               ▼
    [ 미들웨어 1: 요청 처리 전 ]
               ▼
    [ 미들웨어 2: 요청 처리 전 ]
               ▼
     ... 여러 미들웨어 ...
               ▼
       ▶ 컨트롤러 실행 ◀
               ▲
    [ 미들웨어 2: 응답 처리 후 ]
               ▲
    [ 미들웨어 1: 응답 처리 후 ]
               ▲
           클라이언트 응답

예제 코드

// Program.cs
app.Use(async (context, next) =>
{
    Console.WriteLine("🔥 [미들웨어1 - 요청]");
    await next(); // 컨트롤러로 전달
    Console.WriteLine("✅ [미들웨어1 - 응답]");
});

app.Use(async (context, next) =>
{
    Console.WriteLine("🔧 [미들웨어2 - 요청]");
    await next(); // 컨트롤러로 전달
    Console.WriteLine("🧼 [미들웨어2 - 응답]");
});

app.MapControllers(); // 컨트롤러에서 실제 처리

요점 정리

  • await next() 매서드 호출시 다음 미들웨어 또는 컨트롤러 호출
  • await next() 이후의 코드는 컨트롤러 실행 후에 "되돌아올 때" 실행된다.
  • 해당 구조를 사용하면
    • 요청/응답 로깅(Logging)
    • JWT 인증 검사
    • 응답 포맷 커스텀하게 변경
    • 에러 핸들링 등 구현이 가능

응답 커스터마이징 예제 코드

app.Use(async (context, next) =>
{
    var originalBody = context.Response.Body;
    using var memStream = new MemoryStream();
    context.Response.Body = memStream;

    await next(); // 컨트롤러 실행

    memStream.Position = 0;
    var responseBody = new StreamReader(memStream).ReadToEnd();

    Console.WriteLine($"[응답 로그]: {responseBody}");

    memStream.Position = 0;
    await memStream.CopyToAsync(originalBody);
    context.Response.Body = originalBody;
});

같이 읽으면 좋은 글

 

ASP.NET Core 미들웨어

ASP.NET Core 미들웨어 및 요청 파이프라인에 대해 알아봅니다.

learn.microsoft.com

댓글