Использование IEnumerable<> и IFormFileCollection в минимальном API .NET 6

Проблема в том, что у меня есть API, который объединяет pdf-файлы из URL-адресов и работает в .NET 5 , но при переходе на .NET 6 использование IEnumerable<> , IFormFile и IFormFileCollection просто принимает только запросы application/json.

Вот конечная точка в .NET 5 (работает)

      [HttpPost]
        public async Task<IActionResult> ConcatenarPdfsByUrl([FromForm] IEnumerable<string> urls)
        {
            var output = await TransformaPdfCore.PdfConcatenation(urls);
            return File(output, "application/octet-stream");
        }

результат: Imagem 1 (.net 5)

Так же как и конечная точка в минимальном .net6

      app.MapPost("/ConcatenaPdfsByUrl", async Task<IResult> (IEnumerable<string> urls, TransformaPdfCore transforma) =>
{
    {
        var output = await transforma.PdfConcatenation(urls);
        return Results.File(output, "application/octet-stream");
    }
}).Accepts<IEnumerable<string>>("multipart/form-data");

Но результат такой: Imagem 2 (.net 6)

Вопрос в том, почему IEnumerable не ведет себя так же? и если есть какое-то решение, например, с помощью IOperationFilter, чтобы я мог заставить его работать.

Интерфейс IFormFileCollection имел ту же проблему.

1 ответ

В настоящее время привязка из формы не поддерживается для минимальных API. Вы можете отслеживать эту проблему на github — исследуется поддержка .NET 7. Вы можете попробовать реализовать пользовательскую привязку из формы черезBindAsyncметод с использованием HttpContext.Request.Formили просто добавить HttpContextпараметр вашего метода обработчика и используйте его там:

      app.MapPost("/ConcatenaPdfsByUrl", async (HttpContext context, TransformaPdfCore transforma) =>
{
    // use context.Request.Form or context.Request.Form.Files
    var output = await transforma.PdfConcatenation(urls);
    return Results.File(output, "application/octet-stream");
})
Другие вопросы по тегам