IFormFile API ASPNetCore возвращает неверный ввод

У меня есть API, и я пытаюсь загрузить изображение. Я пытался использовать чванство и почтальон.

Все, что я возвращаю, это

{
    "": [
        "The input was not valid."
    ]
}

Вот как выглядит мой код ->

Контроллер -

    [HttpPost("images")]
    public async Task<IActionResult> UploadImage(IFormFile file)
    {
        return await _imageHandler.UploadImage(file);
    }

Обработчик изображений -

public interface IImageHandler
{
    Task<IActionResult> UploadImage(IFormFile file);
}

public class ImageHandler : IImageHandler
{
    private readonly IImageWriter _imageWriter;
    public ImageHandler(IImageWriter imageWriter)
    {
        _imageWriter = imageWriter;
    }

    public async Task<IActionResult> UploadImage(IFormFile file)
    {
        var result = await _imageWriter.UploadImage(file);
        return new ObjectResult(result);
    }
}

И, наконец, автор изображений

public class WriterHelper
{
    public enum ImageFormat
    {
        bmp,
        jpeg,
        gif,
        tiff,
        png,
        unknown
    }

    public static ImageFormat GetImageFormat(byte[] bytes)
    {
        var bmp = Encoding.ASCII.GetBytes("BM");     // BMP
        var gif = Encoding.ASCII.GetBytes("GIF");    // GIF
        var png = new byte[] { 137, 80, 78, 71 };              // PNG
        var tiff = new byte[] { 73, 73, 42 };                  // TIFF
        var tiff2 = new byte[] { 77, 77, 42 };                 // TIFF
        var jpeg = new byte[] { 255, 216, 255, 224 };          // jpeg
        var jpeg2 = new byte[] { 255, 216, 255, 225 };         // jpeg canon

        if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
            return ImageFormat.bmp;

        if (gif.SequenceEqual(bytes.Take(gif.Length)))
            return ImageFormat.gif;

        if (png.SequenceEqual(bytes.Take(png.Length)))
            return ImageFormat.png;

        if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
            return ImageFormat.tiff;

        if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
            return ImageFormat.tiff;

        if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
            return ImageFormat.jpeg;

        if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
            return ImageFormat.jpeg;

        return ImageFormat.unknown;
    }
}

Я следовал этому руководству -> https://www.codeproject.com/Articles/1256591/Upload-Image-to-NET-Core-2-1-API

Я уже изменил Swagger в проекте, чтобы иметь возможность загружать файлы, но даже swagger выдает ту же ошибку. У меня нет других ошибок в моем коде, и отладка ничего не делает (пытаюсь установить точки останова в моем контроллере, но, видимо, они не принимают или не должны, все еще учимся здесь).

Любая помощь будет оценена. Спасибо!

введите здесь описание изображения

Сделал чистый тест, и проблема, похоже, в [ApiController]. Любая идея, почему/как я могу это исправить?


person Dante R.    schedule 26.09.2018    source источник
comment
Вы выбрали данные формы в почтальоне и тип = файл?   -  person Baral    schedule 26.09.2018
comment
@Baral Да, конечно, иначе я бы не смог проверить это должным образом.   -  person Dante R.    schedule 26.09.2018
comment
Взгляните на это: stackoverflow.com/questions/46895523/   -  person Baral    schedule 26.09.2018
comment
Дело в том, что я поставил точку останова на возврате моих контроллеров, и он даже не останавливается, поэтому я предполагаю, что он выдает недопустимую ошибку ввода, прежде чем даже пытаться перейти к моему ImageHandler. Я только что попытался добавить return BadRequest(ModelState) с фиктивной моделью, чтобы посмотреть, что я верну, и это тот же... неверный ввод.   -  person Dante R.    schedule 26.09.2018
comment
Я предполагаю, что он не смог найти правильный маршрут к вашему API. Если вы посмотрите на ссылку в моем предыдущем комментарии, похоже, вам нужно передать список IFormFile (IList‹IFormFile›)   -  person Baral    schedule 26.09.2018
comment
Пробовал там все, результат тот же. Я даже попробовал код, который, кажется, решил его проблему. Есть ли что-то, что я должен добавить в свое приложение, чтобы иметь возможность обрабатывать загрузку файлов и тому подобное? (что-то, что не было описано в учебнике, которому я следовал).   -  person Dante R.    schedule 26.09.2018
comment
Давайте продолжим обсуждение в чате.   -  person Baral    schedule 26.09.2018
comment
Поделитесь с нами снимком экрана почтальона. Я провел тест с помощью FileController. и PostMan. Примечание, в почтальоне нет заголовков.   -  person Edward    schedule 27.09.2018
comment
Добавил фото почтальона. В моих заголовках есть только токен Auth Bearer   -  person Dante R.    schedule 27.09.2018
comment
Это была опечатка, до сих пор не работает (в чванстве тоже не работает).   -  person Dante R.    schedule 27.09.2018
comment
Я только что создал очень простой проект, в котором есть один контроллер, принимающий загрузку файла от Postman, и он работает без проблем. Если ваш контроллер даже не срабатывает, вероятно, происходит что-то, что не очевидно в вашем вопросе. Если это практично, вы можете подумать о том, чтобы свести это к минимально воспроизводимому примеру и/или подтолкнуть что-то к например Github, демонстрирующий проблему.   -  person Kirk Larkin    schedule 27.09.2018
comment
Дело в том, что я вижу Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Route соответствует {action = UploadImage, controller = Blog}. Выполнение действия WebApi.Controllers.BlogController.UploadImage (WebApi). Похоже, оно выполняется. Но я даже не могу его отладить (никогда не получаю код возврата из этого метода контроллера). Я понятия не имею, что такое минимальный воспроизводимый пример, к сожалению, и я не знаю, что отправить на github, если честно. Приведенный выше код — это все, что я добавил для загрузки. Думаю попробовать сделать для него отдельный контроллер..   -  person Dante R.    schedule 27.09.2018
comment
Нашел проблему. Очевидно, это из-за [ApiController], который у меня есть в моем BlogController. Как-то обойти это?   -  person Dante R.    schedule 27.09.2018
comment
Ух ты! Это происходит со мной прямо сейчас.   -  person hubert17    schedule 27.09.2018
comment
Вы используете ASP.NET Core 2.0 или 2.1? Ваш тег говорит 2.0, но ApiController был добавлен в 2.1. В любом случае, я думаю, вы исправите это, если будете следовать инструкциям здесь для установки версии совместимости.   -  person Kirk Larkin    schedule 27.09.2018
comment
@ДантеР. Удаление [ApiController] работает! Чтобы дать вам общее представление .. Я пытаюсь заставить кнопку загрузки файла в Swagger работать. Это решает проблему. Благодарю вас!   -  person hubert17    schedule 27.09.2018
comment
@ hubert17 Посмотрите, что Кирк связал. Только что нашел еще один вопрос о стеке, который, похоже, исправил его. stackoverflow.com/questions/50919430/ Спасибо, ребята.   -  person Dante R.    schedule 27.09.2018


Ответы (1)


Нашел свою проблему и нашел свое решение. Обнаружив, что моя проблема была [ApiController], я наткнулся на другую проблему с переполнением стека, связанную с этим.

Это решило мою проблему. Изменениеservices.AddMvc() на -> services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

person Dante R.    schedule 27.09.2018