Как загрузить файл и модель с помощью Web API?

В основном я пытаюсь загрузить изображение вместе с перечислением с помощью Web API 2.

Здесь подпись контроллера:

[HttpPost]
public UploadResponseVm Upload([FromBody]ResImageType type)
{

Дело в том, что всякий раз, когда я пытаюсь опубликовать многостраничную форму (с файлом и типом), я получаю ошибку 415:

{ "Сообщение": "Тип носителя данных типа" multipart/form-data "- это не поддерживается для этого ресурса.", "ExceptionMessage": "Нет MediaTypeFormatter доступен для чтения объекта типа" ResImageType "из контента с типом мультимедиа 'Многочастному/форм-данных" "ExceptionType.": "System.Net.Http.UnsupportedMediaTypeException" "StackTrace": "в System.Net.Http.HttpContentExtensions.ReadAsAsync [T] (HttpContent содержимое, Тип типа, IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable 1 форматировщик, IFormatterLogger formatterLogger, CancellationToken cancelationToken)" }

Я даже добавил следующее к моему классу startup.cs:

    config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());

Как загрузить модель вместе с файлом с помощью веб-контроллера api?

Ответ 1

Нет форматера, который мог бы обрабатывать/относиться к вашему объекту ResImageType. Я однажды решил аналогичную проблему без форматирования, используя метод без параметров и обработал данные внутри метода. Например:

public async Task<HttpResponseMessage> PostFormData()
    {
        if (!Request.Content.IsMimeMultipartContent("form-data"))
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }

            string upDir= "PathOfDirectory";

            MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(upDir);                
            MultipartFileStreamProvider multipartFileStreamProvider = await Request.Content.ReadAsMultipartAsync(streamProvider);

            // Loop through files.
            foreach (MultipartFileData file in streamProvider.FileData)
            {
                // Save filepaths to DB or do something else
            }
            return Request.CreateResponse(HttpStatusCode.OK);
    }

Аналогичное решение из MS Docs

Другая возможность - создать класс, подобный DTO, который используется для передачи объекта и использования форматирования, например MultipartDataMediaFormatter кажется законным (не пробовал).