Почему эта строка не привязывается к параметру имени файла в ASP.NET .Core API Action? - PullRequest
0 голосов
/ 24 мая 2018

Я тестирую API с помощью fiddler, используя следующий заголовок и тело, и POSTing в http://localhost:50063/api/image:

User-Agent: Fiddler
Content-Type: application/json; charset=utf-8
Host: localhost:50063
Content-Length: 32330

{"filename": "bot.png", "file": "base64 image ellided for brevity"}

Пример кода из руководства

[ApiController]
[Produces("application/json")]
[Route("api/Image")]
public class ImageController : Controller
{

    // POST: api/image
    [HttpPost]
    public void Post(byte[] file, string filename)
    {
        string filePath = Path.Combine(_env.ContentRootPath, "wwwroot/images/upload", filename);
        if (System.IO.File.Exists(filePath)) return;
        System.IO.File.WriteAllBytes(filePath, file);
    }

    //...

}

Сначала я получил ошибку 500 с пустым именем файла.Я добавил [ApiController] Атрибут к классу контроллера и получаю ошибку 400 имя файла недействительно .

Когда я делаю такой же запрос, filename связывается со сложным классом:

    [HttpPost("Profile")]
    public void SaveProfile(ProfileViewModel model)
    {
        string filePath = Path.Combine(_env.ContentRootPath, "wwwroot/images/upload", model.FileName);
        if (System.IO.File.Exists(model.FileName)) return;
        System.IO.File.WriteAllBytes(filePath, model.File);
    }

    public class ProfileViewModel
    {
        public byte[] File { get; set; }
        public string FileName { get; set; }
    }

Почему это происходит?

1 Ответ

0 голосов
/ 24 мая 2018

Запрос содержимого может быть прочитан только из тела один раз.

В первом примере после заполнения массива он может заполнять строку, так как тело уже прочитано.

Во втором примере он заполняет модель одним чтением тела.

Как только поток запроса считывается для параметра, обычно невозможно снова прочитать поток запроса дляпривязка других параметров.

Ссылка Привязка модели в ASP.NET Core

...