Compartir a través de


Convierta los métodos de mapa en delegados de solicitudes con el generador de delegados de solicitudes de ASP.NET Core

El generador de delegados de solicitudes (RDG) de ASP.NET Core es un generador de código fuente en tiempo de compilación que compila controladores de rutas proporcionados a una API mínima para solicitar delegados que pueden ser procesados por la infraestructura de enrutamiento de ASP.NET Core. El RDG se habilita de manera implícita cuando las aplicaciones se publican con AoT habilitado o cuando el recorte está habilitado. RDG genera código descriptivo de AoT y recorte nativo.

Nota:

  • La característica AOT nativo se encuentra actualmente en versión preliminar.
  • En .NET 8, no todas las características de ASP.NET Core son compatibles con AOT nativo.

RDG:

Cuando la publicación y el AOT nativo no están habilitados:

  • Los métodos Map asociados a una ruta específica se compilan en memoria en un delegado de solicitud cuando se inicia la aplicación, no cuando se compila la aplicación.
  • Los delegados de solicitud se generan en tiempo de ejecución.

Al publicar con AOT nativo habilitado:

  • Los métodos Map asociados a una ruta específica se compilan cuando se compila la aplicación. El RDG crea el delegado de solicitud para la ruta y el delegado de solicitud se compila en la imagen nativa de la aplicación.
  • Elimina la necesidad de generar el delegado de solicitud en tiempo de ejecución.
  • Garantiza:
    • Los tipos utilizados en las API de la aplicación están arraigados en el código de la aplicación de una manera que la cadena de herramientas nativa de AOT puede analizar estáticamente.
    • El código necesario no se recorta.

RDG:

  • Se habilita automáticamente en proyectos cuando se habilita la publicación con AOT nativo o el recorte.
  • Se puede habilitar manualmente incluso cuando no se usa AOT nativo configurando <EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator> en el archivo del proyecto:
<Project Sdk="Microsoft.NET.Sdk.Web">

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

La habilitación manual de RDG puede ser útil para:

  • Evaluación de la compatibilidad de un proyecto con AOT nativo.
  • Para reducir el tiempo de inicio de la aplicación, genere previamente los delegados de solicitud.

Las API mínimas están optimizadas para usar System.Text.Json, lo que requiere el uso del generador de código fuente System.Text.Json. Todos los tipos aceptados como parámetros en delegados de solicitud o devueltos en las API mínimas se deben configurar en un objeto JsonSerializerContext registrado mediante la inserción de dependencias de ASP.NET Core:

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
{

}

Diagnóstico para escenarios de RDG no admitidos

Cuando se compila la aplicación, RDG emite diagnósticos para escenarios que no son compatibles con AOT nativo. Los diagnósticos se emiten como advertencias y no impiden que la aplicación se compile. Para obtener la lista de diagnósticos, vea Diagnósticos del generador de delegados de solicitudes principales de ASP.NET Core.