Share via


ASP.NET 핵심 요청 대리자 생성기를 사용하여 Map 메서드를 요청 대리자로 전환

ASP.NET RDG(핵심 요청 대리자 생성기)는 최소 API에 제공된 경로 처리기를 컴파일하여 ASP.NET Core의 라우팅 인프라에서 처리할 수 있는 대리자를 요청하는 컴파일 시간 원본 생성기입니다. RDG는 애플리케이션이 AoT를 사용하도록 설정된 상태로 게시되거나 트리밍이 사용하도록 설정된 경우 암시적으로 사용하도록 설정됩니다. RDG는 트리밍 및 네이티브 AoT 친화적인 코드를 생성합니다.

참고 항목

  • 네이티브 AOT 기능은 현재 미리 보기로 제공됩니다.
  • .NET 8에서는 모든 ASP.NET Core 기능이 Native AOT와 호환되는 것은 아닙니다.

The RDG:

게시 및 네이티브 AOT를 사용할 수 없는 경우:

  • Map 특정 경로와 연결된 메서드는 앱이 빌드될 때가 아니라 앱이 시작될 때 메모리에서 요청 대리자로 컴파일됩니다.
  • 요청 대리자는 런타임에 생성됩니다.

Native AOT를 사용하도록 설정된 상태로 게시하는 경우:

  • Map 특정 경로와 연결된 메서드는 앱이 빌드될 때 컴파일됩니다. RDG는 경로에 대한 요청 대리자를 만들고 요청 대리자는 앱의 네이티브 이미지로 컴파일됩니다.
  • 런타임에 요청 대리자를 생성할 필요가 없습니다.
  • 보장:
    • 앱의 API에 사용되는 형식은 네이티브 AOT 도구 체인에서 정적으로 분석할 수 있는 방식으로 앱 코드에 루팅됩니다.
    • 필요한 코드는 잘리지 않습니다.

The RDG:

  • Native AOT를 사용하여 게시를 사용하도록 설정하거나 트리밍을 사용하는 경우 프로젝트에서 자동으로 사용하도록 설정됩니다.
  • 프로젝트 파일에서 설정하여 Native AOT를 사용하지 않는 경우에도 수동으로 사용하도록 설정할 <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator> 수 있습니다.
<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
  </PropertyGroup>
    
</Project>

RDG를 수동으로 사용하도록 설정하는 것은 다음과 같은 경우에 유용할 수 있습니다.

  • 네이티브 AOT와 프로젝트의 호환성 평가
  • 요청 대리자를 미리 생성하여 앱의 시작 시간을 줄입니다.

최소 API는 System.Text.Json 원본 생성기를 사용해야 하는 사용에 System.Text.Json최적화되어 있습니다. 최소 API의 요청 대리자에서 매개 변수로 허용되거나 반환되는 모든 형식은 ASP.NET Core의 종속성 주입을 통해 등록된 형식에 JsonSerializerContext 대해 구성되어야 합니다.

using System.Text.Json.Serialization;

var builder = WebApplication.CreateSlimBuilder(args);

builder.Services.ConfigureHttpJsonOptions(options =>
{
    options.SerializerOptions.TypeInfoResolverChain.Insert(
                         0, AppJsonSerializerContext.Default);
});

var app = builder.Build();

var sampleTodos = new Todo[] {
    new(1, "Walk the dog"),
    new(2, "Do the dishes", DateOnly.FromDateTime(DateTime.Now)),
    new(3, "Do the laundry", DateOnly.FromDateTime(DateTime.Now.AddDays(1))),
    new(4, "Clean the bathroom"),
    new(5, "Clean the car", DateOnly.FromDateTime(DateTime.Now.AddDays(2)))
};

var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
    sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
        ? Results.Ok(todo)
        : Results.NotFound());

app.Run();

public record Todo(int Id, string? Title, DateOnly? DueBy = null, bool IsComplete = false);

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

지원되지 않는 RDG 시나리오에 대한 진단

앱이 빌드되면 RDG는 네이티브 AOT에서 지원되지 않는 시나리오에 대한 진단 내보낸다. 진단 경고로 내보내지고 앱이 빌드되는 것을 방지하지 않습니다. 진단 목록은 ASP.NET Core Request Delegate Generator 진단 참조하세요.