Проблема с обновлением метода 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);