반응형
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
'프로그래밍 > C#' 카테고리의 다른 글
C# is 패턴 매칭(Pattern Matching)에 대해서 알아보자 (0) | 2025.04.26 |
---|---|
JWT를 활용해서 C# 서버에서 사용자 인증 처리하기 (0) | 2025.04.23 |
C# 환경변수로 appsettings.json 값 덮어쓰기 (0) | 2025.04.12 |
C# 2개의 list 하나로 합치기 (0) | 2025.03.30 |
JSON 점 표기법(Dot Notation)에 대해서 (0) | 2025.03.06 |
댓글