[Core 3.1] ASP.NET Core 미들웨어

728x90
반응형

 

 

원 글은 MSDN의 문서입니다만, 해당 글을 그대로 읽고 있자니, 이해가 안되는 부분이 있어서 영문버전의 MSDN을 각각 번역하면서 다시 한번 정리한 글입니다.


미들웨어란?

요청과 응답을 처리하기 위해 앱 파이프라인으로 구성되는 소프트웨어 입니다.

각 구성요소
- 파이프라인의 다음 구성 요소로 요청을 전달할지 여부를 선택합니다.
- 파이프라인에서 다음 구성 요소 전후에 작업을 수행할 수 있습니다. 

 

요청 Delegate

1. 요청 파이프라인을 빌드하는데 사용됩니다.

2. 각 HTTP 요청을 처리합니다.

3. Run, Map, Use 확장 메서드를 사용하여 구성됩니다.

 

개별 요청 Delegate를 익명 메소드로 인라인으로 지정할 수 있습니다. (인라인 미들웨어로 불림)

또는 재사용 가능한 클래스에서 정의 될 수 있습니다.

이러한 재사용 가능한 클래스와 인라인 익명 메소드는 미들웨어 구성요소라고도 불리우는 미들웨어 입니다.

 

요청 파이프라인의 각 미들웨어 컴포넌트는 파이프라인에서 다음 컴포넌트를 호출하거나, 파이프라인을 단락 시킵니다.

미들웨어가 단락되면 추가 미들웨어가 요청을 처리하지 못하기 때문에, 이를 터미널 미들웨어라고 합니다. 

 


IApplicationBuilder로 미들웨어 파이프라인 만들기

ASP.NET Core 요청 파이프라인은 하나씩 차례로 호출되는 요청 Delegate 시퀀스로 구성됩니다. 

다음 다이어그램은 그 개념을 보여줍니다. 실행 스레드는 검은색 화살표를 따릅니다.

 

 

각 delegate는 다음 delegate 전과 후에 작업을 수행할 수 있습니다. 

Exception-handling delegates는 파이프라인의 이후 단계에서 발생하는 예외를 잡을 수 있도록 파이프라인의 초기에 호출되어야 합니다.


가장 간단한 ASP.NET Core 앱은 모든 요청을 처리하는 단일 요청 delegate를 설정합니다.

이 경우에는 실제 요청 파이프 라인을 포함하지 않습니다. 대신에 단일 익명 함수가 모든 HTTP 요청에 대한 응답으로 호출됩니다.

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello, World!");
        });
    }
}

첫 번째 Run 대리자는 파이프라인을 종료합니다.

 

Use를 사용하여 여러 요청 delegate와 연결합니다. 

next 매개 변수는 파이프라인의 다음 delegate를 나타냅니다. 

next 매개 변수를 호출하지 않으면 파이프라인을 단락시킬수 있습니다.

 

다음 예제의 설명처럼, 일반적으로 next Delegate 전과 후 모두에서 작업을 수행할 수 있습니다.

public class Startup
{
    public void Configure(IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            // Do work that doesn't write to the Response.
            await next.Invoke();
            // Do logging or other work that doesn't write to the Response.
        });

        app.Run(async context =>
        {
            await context.Response.WriteAsync("Hello from 2nd delegate.");
        });
    }
}

delegate 가 next delegate에 요청을 전달하지 않을 때 이를 요청 파이프라인을 단락(short-circuiting) 한다고 합니다. 

단락(short-circuiting)은 불필요한 작업을 방지하기 때문에 종종 바람직합니다. 

예를 들어 정적 파일 미들웨어는 정적 파일에 대한 요청을 처리하고 나머지 파이프라인을 단락(short-circuit)하여 터미널 미들웨어로 작동할 수 있습니다. 

추가 처리를 종료하는 미들웨어 전에 파이프라인에 추가된 미들웨어는 next.Invoke 문 이후의 코드를 계속 처리합니다.

그러나 이미 전송 된 응답에 쓰려고 시도하는 것에 대한 다음 경고를 참조하십시오.

 

경고

응답이 클라이언트에 전송된 후 next.Invoke를 호출하지 마십시오. 응답이 시작된 후 HttpResponse로 변경하면 예외가 발생합니다. 예를 들어 헤더 및 상태 코드를 설정하는 변경 작업은 예외를 발생시킵니다. next를 호출한 후 응답 본문에 작성할 경우:

  • 프로토콜 위반이 발생할 수 있습니다. 예를 들어, 명시된 Content-Length보다 긴 내용이 작성될 수 있습니다.
  • 본문 형식을 손상시킬 수 있습니다. 예를 들어, CSS 파일에 HTML 바닥글을 작성할 수 있습니다.

HasStarted는 헤더가 이미 전송됐는지 또는 본문이 이미 작성됐는지 여부를 나타내는 유용한 힌트를 제공해줍니다.


 

 

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1
https://docs.microsoft.com/ko-kr/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1

 

728x90