Проблема с обновлением метода IEndpointRouteBuilder с .Net6 до .Net8.

Следующий метод определяет мои конечные точки и отлично работает в .Net 6. Сейчас я обновляю это приложение до .Net 8, прежде чем зайти слишком далеко, поскольку через несколько месяцев это станет стандартом.

      public static void DefineEndpoints(IEndpointRouteBuilder app)
{
        
    app.MapPost(BaseRoute, CreateNoteAsync)
        .WithName("CreateNote")
        .Accepts<Note>(ContentType)
        .Produces<Note>(201).Produces<IEnumerable<ValidationFailure>>(400)
        .WithTags(Tag);

    app.MapGet(BaseRoute, GetAllNotesAsync)
        .WithName("GetNotes")
        .Produces<IEnumerable<Note>>(200)
        .WithTags(Tag);

    app.MapGet($"{BaseRoute}/{{symbol}}", GetNotesByTickerAsync)
        .WithName("GetNotesForSymbol")
        .Produces<IEnumerable<Note>>(200)
        .WithTags(Tag);
    app.MapGet($"{BaseRoute}/{{symbol}}/{{date}}", GetNotesForSymbolOnDateAsync)
        .WithName("GetNotesForSymbolByDate")
        .Produces<IEnumerable<Note>>(200)
        .WithTags(Tag);

    app.MapPut($"{BaseRoute}/{{symbol}}/{{date}}", UpdateNoteAsync)
        .WithName("UpdateNote")
        .Accepts<Note>(ContentType)
        .Produces<Note>(200).Produces<IEnumerable<ValidationFailure>>(400)
        .WithTags(Tag);

    app.MapDelete($"{BaseRoute}/{{symbol}}/{{date}}", DeleteNoteAsync)
        .WithName("DeleteNote")
        .Produces(204).Produces(404)
        .WithTags(Tag);
    // rest removed for brevity
}

Произведенная ошибка

Код серьезности Описание Ошибка состояния подавления строки файла проекта CS1929 «IEndpointConventionBuilder» не содержит определения для «Accepts», а для лучшей перегрузки метода расширения «OpenApiRouteHandlerBuilderExtensions.Accepts(RouteHandlerBuilder, string, params string[])» требуется получатель типа «Microsoft» .AspNetCore.Builder.RouteHandlerBuilder' BATLWebApp.Net8.Api C:\Users\Trader\source\repos\BATLWebApp.Net8\BATLWebApp.Net8.Api\Endpoints\NoteEndpoints.cs 19 Активен

Я получаю ту же ошибку и для метода .Produces.

Я вижу, что он говорит мне, что мне нужно использовать RouteHandlerBuilder, но, судя по тому, что я вижу в документации .Net 8, RouteHandlerBuilder принимает IEnumerable

Роутхандлербуилдер (IEnumerable)

и класс OpenApiRouteHandlerBuilderExtensions нуждается в этом построителе.

Я не очень разбираюсь в использовании минимальных API, и у меня возникли проблемы с рефакторингом этого для работы в .Net 8, и я в равной степени не уверен, что ошибка подталкивает меня в правильном направлении. Любые эксперты по маршрутизации API, знакомые с методами .Net 8, пожалуйста, помогите.

ОБНОВЛЕНИЕ: Вот пример вызываемых методов. Все они являются асинхронными задачами.

      private static async Task<IResult> CreateNoteAsync(Note note, TableServiceManager tableServiceManager, IValidator<Note> validator)
{
    var validationResult = await validator.ValidateAsync(note);
    if (!validationResult.IsValid)
    {
        return Results.BadRequest(validationResult.Errors);
    }
    var equityNote = MapNoteToEquityNoteEntity(note);

    try
    {
        var created = await tableServiceManager.AddEquityNoteAsync(equityNote);
        Results.Created($"/{BaseRoute}/{note.Ticker}", note);
    }
    catch (Exception ex)
    {
        var errorMessage = $"Error creating note for {note.Ticker} on {note.NoteDate} due to {ex.Message}";
        Log.Error(ex, errorMessage);
        return Results.BadRequest(errorMessage);
    }
    return Results.BadRequest();
}

1 ответ

КлассEndpointRouteBuilderExtensionsимеет два метода:

      public static class EndpointRouteBuilderExtensions
{
    public static RouteHandlerBuilder MapGet(
        this IEndpointRouteBuilder endpoints,
        [StringSyntax("Route")] string pattern,
        Delegate handler)
    { ... }

    public static IEndpointConventionBuilder MapGet(
        this IEndpointRouteBuilder endpoints,
        [StringSyntax("Route")] string pattern,
        RequestDelegate requestDelegate)
    { ... }
}

Я подозреваю, что метод обработки запроса (CreateNoteAsync,GetAllNotesAsync, ... ) имеет типRequestDelegate, затем компилятор выбирает метод, который возвращаетIEndpointConventionBuilderэто не имеетAcceptметод.

Вы можете добавить явное приведение, чтобы заставить компилятор выбрать правильный метод.MapGet:

      app.MapPost(BaseRoute, (Delegate)CreateNoteAsync)
    .WithName("CreateNote")
    .Accepts<Note>(ContentType)
    .Produces<Note>(201).Produces<IEnumerable<ValidationFailure>>(400)
    .WithTags(Tag);
Другие вопросы по тегам