У меня есть приложение .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)