ПОСТ IFormFile не делает это к действию - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть приложение .NET Core, которое имеет контроллер с именем Documents с подписью POST, например:

[HttpPost]
public async Task<IActionResult> PostAsync(CreateDocumentRequest createDocumentRequest)

CreateDocumentRequest выглядит следующим образом:

public class CreateDocumentRequest
{
    public string Name { get; set; }

    public string Description { get; set; }

    public IFormFile File { get; set; }
}

Довольно просто.Затем у меня есть запрос POST, настроенный в Почтальоне следующим образом:

  • URL: http://localhost:9090/api/documents
  • Тело: настроено какform-data и у меня Name, Description и File все настроено в интерфейсе пары ключ-значение.Кроме того, File установлен как тип file, поэтому он позволил мне найти файл.

При выполнении этого POST DocumentsController выполняет конструктор, и Application Insights указывает, чтоPostAsync было найдено совпадение:

Активированное время события Длительность Поток Поток Информация о приложении: трассировка "Маршрут соответствует {action =" PostAsync ", controller =" Documents "}. Выполнение действия TdlLims.MediaService.Controller.DocumentsController.PostAsync (TdlLims.MediaService) "

Однако он никогда не входит в действие.Моя интуиция говорит мне, что привязка модели не работает.Это по двум причинам.Один, все остальные части маршрутизации работают в соответствии с Application Insights.Во-вторых, если я удаляю параметры полностью, он входит в действие.Что я пробовал:

  • Добавил [FromForm] к createDocumentRequest
  • Принял только IFormFile в действие, бросив сложный объект
  • Разделите CreateDocumentRequest на три разных параметра
  • И некоторые другие вещи по пути с меньшей значимостью

Теперь я подозреваю, что когда мы настраиваем Mvc,мы можем что-то упустить.Мы настраиваем несколько вещей, но я чувствую, что нам как-то не хватает форматера для multipart/form-data.Я чувствую это так, потому что мы используем AddMvcCore вместо AddMvc:

.AddAuthorization()
.AddJsonFormatters()
.AddApiExplorer()
.AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new OptionConverter());
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

Наконец, я могу подтвердить, что контроллер работает в целом, потому что у меня есть GET, который доступен иэто делает это к действию:

[HttpGet("{id}")]
public async Task<IActionResult> GetAsync(int id)

1 Ответ

0 голосов
/ 19 февраля 2019

В итоге проблема заключалась в размере файла.Было бы хорошо, если бы .NET Core выдавал ошибку, а не возвращал 200, когда что-то подобное происходило.Я пытался загрузить несколько изображений, и мне нужно будет найти правильный способ увеличить размер файла, но когда я загрузил небольшой текстовый файл, POST сработал, и файл был десериализован должным образом в IFormFile.

Я считаю, что атрибуты RequestFormLimits и RequestSizeLimit будут играть роль в настройке максимального размера файла в конце.

...