ASP.NET Core3.X 터미널 중간부품을 끝점 루트로 변환하여 실행

5149 단어 ASP.NETCORE
인용문
며칠 전.NET Core3.1 발표, 그래서 저는 회사의 기초 유니버설 시스템을 업그레이드했고 몇 개의 기초 모듈을 삭제했습니다. 물론 이 몇 개의 기초 모듈과.NET Core3.1 상관없어요. 지불 모듈이 포함되어 있어요. 업그레이드가 끝난 후에 정문(동료)이 지불을 삭제했냐고 물었어요.글쎄요. 어떻게 넣을지 생각 안 했어요.
이야기는 여기서부터 시작한다
지불을 고려할 때 저는 지불 sdk를 시스템에 어떻게 직접 도입하고 일련의 지불 루트를 가질 수 있는지 고려해야 합니다. 만약에 지정한 주소에 응답을 만들면 so는 제 목적을 달성하기 위해 중간부품을 사용자 정의할 수 있는 방법을 생각하기 시작했습니다. Use, Run, Map??
경로의 진급
라우팅은 요청 URI를 끝점에 매핑하고 해당 끝점에 전달된 요청을 스케줄링합니다.라우팅은 응용 프로그램에서 정의되고 응용 프로그램이 시작될 때 구성됩니다.라우팅은 요청에 포함된 URL에서 값을 추출하도록 선택할 수 있으며 이러한 값을 사용하여 요청을 처리할 수 있습니다.응용 프로그램의 라우팅 정보를 사용하여 라우팅이 끝점에 매핑되는 URL을 생성할 수도 있습니다.
ASP에서.NET Core 2.1 이하 버전에서는 Irouter에서 전송된 URL을 프로세서의 인터페이스에 매핑하여 라우팅합니다.일반적으로 인터페이스를 직접 실현하는 것이 아니라 MvcMiddleware를 중간부품 파이프 끝에 직접 의존합니다.MvcMiddleware에 요청이 도착하면 전송 요청 URL 경로에 대응하는 컨트롤러와 동작을 확인하는 루트가 적용됩니다.
그런 다음 요청이 처리 프로그램을 실행하기 전에 다양한 MVC 필터를 거칩니다.이 필터들은 또 다른 '파이프' 를 형성하여 중간부품 파이프를 연상시키고, 어떤 경우에는 반드시 중간부품의 행위를 복제해야 한다.대표적인 예가 바로 CORS 정책이다.각 MVC 작업 및 중간부품 파이프의 다른 "분기"에 대해 서로 다른 CORS 정책을 구현하기 위해서는 내부적으로 어느 정도 중복이 필요합니다.
브랜치 중간부품 파이프는 일반적으로 위조 루트에 사용됩니다.맵 ()이 중간부품 파이프에서 확장하는 방법에서는 전송 경로에 지정된 접두사가 있을 때 일부 중간부품을 조건부로 실행할 수 있습니다.
다음과 같습니다.
       app.Map("/order", app => app.Run(async context =>
              {
                  await context.Response.WriteAsync("Order");
              })
            );


이 경우 Run () 방법은 응답을 되돌려주기 때문에 터미널 중간부품입니다.그러나 어떤 의미에서 보면 전체 맵 지점은 응용 프로그램의'단점'에 대응한다.
ASP에서.NET Core 2.2에는 MVC 컨트롤러의 새로운 라우팅 메커니즘으로 종료점 라우팅이 도입되었습니다.이 구현은 본질적으로 내부적으로 MvcMiddleware입니다.
ASP에서.NET Core 2.x에서 Map() 사용
다음에 우리는 중간부품을 사용자 정의합니다. 이 중간부품은 계속해서 호출을 실행하지 않고 바로 되돌아갑니다.next 의뢰, 아주 기본적인 중간부품.
    public class ApiEndpointMiddleware
    {
        private readonly RequestDelegate _next;

        public ApiEndpointMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task InvokeAsync(HttpContext context)
        {
         
            context.Response.StatusCode = 200;

            await context.Response.WriteAsync("Order");
        }

    }

ASP에서.NET Core 2.x에서 확장 방법을 사용하여 이 중간부품에 접근할 경로를 지정하여 Startup에 포함시킬 수 있습니다.cs의 중간부품 파이프에서
public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles();

    app.Map("/order", app => app.UseMiddleware()); versionApp.UseMiddleware()); 

    app.UseMvcWithDefaultRoute();
}

우리가/order나/order/1 루트에 접근하면 사용자 정의 중간부품이 상응하는 값을 되돌려줍니다.
중간부품을 단점 루트로 변환하기
ASP에서.NET Core 3.0에서는 엔드포인트 라우팅을 사용하므로 라우팅 단계와 엔드포인트 호출이 분리됩니다.실제로 이것은 우리가 두 개의 중간부품이 있다는 것을 의미한다.
  • EndpointRouting Middleware의 실제 루트는 지정한 요청 URL 경로에 어떤 단점을 호출할지 계산합니다.
  • EndpointMiddleware에서 호출되는 엔드포인트입니다.

  • 그것들은 두 가지 다른 작용을 하기 때문에 중간부품 파이프의 두 가지 다른 점에 첨가된다.일반적으로, 우리는 후속 중간부품이 실행될 단점에 대한 정보를 접근할 수 있도록 루트 중간부품을 파이프에 미리 두는 것을 생각한다.끝점 호출은 파이프 끝에서 해야 합니다.
    다음과 같습니다.
     public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseHttpsRedirection();
    
                app.UseRouting();
    
                app.UseAuthorization();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                });
    
            }
            
    

    이 UseRouting () 확장 방법은EndpointRouting Middleware를 파이프에 추가하고, UseEndpoints () 확장 방법은Endpoint Middleware를 파이프에 추가합니다.UseEndpoints()는 실제로 응용 프로그램에 모든 끝점의 위치를 등록합니다.
    그러면 어떻게 사용자 정의 중간부품을 단점 루트로 비추나요?
    개념적으로 UseEndpoints()는/OrderURL을 일치하는 경로로 사용하여 버전 끝점의 등록을 호출로 이동합니다.
             endpoints.MapControllers();
                    endpoints.Map("/order",endpoints.CreateApplicationBuilder()
                    .UseMiddleware().Build()).WithDisplayName("order-api");
    
    

    우리 위에서 ASP를 겨냥한NET Core 2.x의 실현 중, 우리는/order,/order/123 등 단점 루트와 일치할 것이다
    예를 들면 다음과 같습니다.
    endpoints.Map("/order/{action}",null);
    

    이것은/order/order/1과 일치하지만/order/status/1과 일치하지 않습니다.그것은 이전 버전보다 기능이 훨씬 강하다.
    이전 예시에서, 우리는 디스플레이 이름 (주로 디버깅 목적에 사용) 을 제공했지만, 권한 수여 정책이나 CORS 정책 같은 다른 정보를 추가할 수 있고, 다른 중간부품은 이 정보를 조회할 수 있다.예를 들면 다음과 같습니다.
         app.UseEndpoints(endpoints =>
                {
                    endpoints.MapControllers();
                    endpoints.Map("/order/{action}",endpoints.CreateApplicationBuilder()
                    .UseMiddleware().Build()).WithDisplayName("order-api").RequireCors("AllowAllHosts")
                .RequireAuthorization("AdminOnly"); 
                });
    
    

    엔드포인트에 CORS 정책(AllowAllHosts)과 승인 정책(AdminOnly)을 추가했습니다.단점에 도착하는 요청이 도착했을 때, 단점을 집행하기 전에 상응하는 조치를 취한다.
    참고 자료
    https://docs.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-3.1#endpoint-routing-differences-from-earlier-versions-of-routing

    좋은 웹페이지 즐겨찾기