Использование 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");
})