#c# #asp.net-core #swagger
#c# #asp.net-core #развязность
Вопрос:
Редактировать:
ПРОБЛЕМА ЗАКЛЮЧАЕТСЯ В SWAGGER. СМОТРИТЕ ОТВЕТ НА МОЕ СОБСТВЕННОЕ ИСПРАВЛЕНИЕ.
В настоящее время я испытываю некоторые проблемы с передачей списка идентификаторов GUID действию контроллера с помощью HTTP POST и [FromForm]
.
Список идентификаторов guid ПУСТ. Если я попытаюсь превратить его в список строк, вместо того, чтобы иметь 3 значения, в списке отображается только 1 значение, и это строка, которая содержит 3 значения, но разделена запятой.
Причина, по которой я использую [FromForm], заключается в том, что мне нужно загрузить файл, но также передать некоторые другие данные в действие.
Я создал пример проекта, который использует swagger, когда вы используете Kestrel для отладки приложения.
bug
Конечная точка ожидает список идентификаторов GUID и список строк и выводит то, что вы публикуете. Когда вы публикуете 2 идентификатора guid и 2 строки, вы должны ожидать, что они оба будут напечатаны. В этом случае найдено и напечатано 0 идентификаторов guid и напечатана 1 строка, которая содержит опубликованные вами значения, но разделена запятой.
works
Конечная точка использует [FromBody] и работает нормально.
Вот проект:https://github.com/sander1095/FromFormGuidListBug
Для людей, которые не хотят видеть проект:
Контроллер:
[HttpPost("bug")]
public ActionResult<string> Bug([FromForm] BugModel bugModel)
{
var message = GetMessage(bugModel);
return Ok(message);
}
Модель:
public class BugModel
{
/// <summary>
/// If you send a GUID it will not appear in this list
/// </summary>
public IEnumerable<Guid> Ids { get; set; }
/// <summary>
/// If you send 3 strings, the list will contain 1 entry with the 3 string comma separated.
/// </summary>
public IEnumerable<string> IdsAsStringList { get; set; }
}
Вызов CURL: curl -X POST "https://localhost:5001/api/Bug/bug" -H "accept: text/plain" -H "Content-Type: multipart/form-data" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "IdsAsStringList="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0""
Результат:
Ids
пуст, пока IdsAsStringList
содержит 1 значение (вместо 2), которое представляет собой 2 строки, вставленные в 1 значение, разделенное запятой.
Комментарии:
1. Вам пришлось бы возвращать
List<string>
в качестве ответа. Попробуйте это:public ActionResult<List<string>> Bug([FromForm] BugModel bugModel)
2. Проблема заключается в запросе, а не в ответе. Меня не волнует возвращаемое значение, я просто хочу, чтобы данные вводились
BugModel
правильно
Ответ №1:
Похоже, моя проблема связана с Swagger, А НЕ с ASP.NET Ядро
Когда я выполняю следующую команду CURL, все работает:
curl -X POST "https://localhost:5001/api/Bug/bug" -H "accept: text/plain" -H "Content-Type: multipart/form-data" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "IdsAsStringList="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0""
Разница здесь в том, что вместо использования
-F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0","9dfb212a-a215-4991-9452-3ddf90e21ec0""
Я использую
-F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0"" -F "Ids="9dfb212a-a215-4991-9452-3ddf90e21ec0""
(Повторяющиеся Ids
поля.)
Я создал проблему в репозитории swaggerhttps://github.com/domaindrivendev/Swashbuckle.AspNetCore/проблемы/1107
Ответ №2:
Я думаю, что проблема в вашем запросе. При публикации списка я всегда добавляю индексы к имени каждого элемента в списке. Попробуйте изменить имя идентификаторов на Ids[0]=»firstguidhere» Ids =[1]=»secondguidhere».