본문 바로가기
ASP.NET Core

.NET Core] Request Pipeline - Run, Map, Use

by Fastlane 2022. 5. 23.
728x90
반응형

.NET Core 어플리케이션은 Program.cs 파일에 어플리케이션 시작 코드를 포함한다. 

 

Program.cs 구성요소 

1. 서비스 추가

2. HTTP Request Pipeline 구성요소 

 

Program.cs 소스 예시)

var builder = WebApplication.CreateBuilder(args);

 

// Add services to the container.

//컨테이너에 서비스를 추가한다. 

//DI프레임워크가 런타임에 이 서비스의 인스턴스를 제공한다. 

builder.Services.AddRazorPages();

builder.Services.AddControllersWithViews();

 

var app = builder.Build();

 

// Configure the HTTP request pipeline

//HTTP Request Pipeline을 구성한다.

//Run, Map, Use 확장메서드를 사용하여 구성한다.

//미들웨어는 Use 확장메서드를 호출하여 파이프라인에 추가되며, 추가된 순서로 실행된다. 

 

if (!app.Environment.IsDevelopment()) {

   app.UseExceptionHandler("/Error"); app.UseHsts();

}

 

app.UseHttpsRedirection();

app.UseStaticFiles();

app.UseAuthorization();

 

//특정 URL을 위한 특정 미들웨어를 추가할때 Map 확장메서드를 사용한다. 

app.MapGet("/hi", () => "Hello!");

app.MapDefaultControllerRoute();

app.MapRazorPages();

 

//Run delegate는 pipeline을 종료시키며, 마지막에 한번만 사용된다.

//Run 뒤의 추가되는 Use, Run은 호출되지 않는다.  

app.Run();

 

//Run 확장메서드를 사용하여, 아래와 같이 terminal middleware를 추가할 수 있다. 

//app.Run(async context => {

//    await context.Response.WriteAsync("Response");

//});

 

Middleware 실행순서

next parameter는 파이프라인의 다음 delegate를 나타내며, next를 호출하면 다음 middleware가 실행되고, 호출하지 않으면 파이프라인이 단락(short-circuit)된다. 

 

app.Use(async (context, next) =>
{
    Console.WriteLine("Use Middleware1 Incoming Request \n");
    await next();
    Console.WriteLine("Use Middleware1 Outgoing Response \n");
});
app.Use(async (context, next) =>
{
    Console.WriteLine("Use Middleware2 Incoming Request \n");
    await next();
    Console.WriteLine("Use Middleware2 Outgoing Response \n");
});
app.Run();

Console output : 

Use Middleware1 Incoming Request  

Use Middleware2 Incoming Request  

Use Middleware2 Outgoing Response 

Use Middleware1 Outgoing Response

Middleware2에서 다음 Middleware를 호출했지만, 더 이상 등록된 Middleware가 없으므로, Request는 되돌아간다. 

남은 소스코드가 있는지 확인하여 실행하며 되돌아간다. 

 

 

728x90
반응형

댓글