#c# #.net #asp.net-web-api
#c# #.net #asp.net-web-api
Вопрос:
Действие, определенное как
[HttpPost]
[Route("api/someinterestingroute/{id}")]
public IHttpActionResult PostSome(int id, [FromBody] BodyModel model)
И модель
public class BodyModel
{
[JsonProperty("field1")]
public string Field1 { get; set; }
[JsonProperty("field2")]
public string Field2 { get; set; }
}
Использование Postman
Action
POST
----------------------------------------------------
url - localhost/myAppName/api/someinterestingroute/5
----------------------------------------------------
Headers
Content-Type: application/json
----------------------------------------------------
Body
{
"field1": "xxx",
"field2": "yyy"
}
Поведение
Когда тело присутствует в postman, я не выполняю действие PostSome
и не получаю unsupported media type
ошибку в ответ.
Когда тело пустое, я нажимаю PostSome
, я вижу id=5
и model
есть null
.
Небольшая деталь заключается в том, что контроллер на самом деле является ODataController
. Но я добавил это как действие, отличное от OData
Большое спасибо!
Комментарии:
1. Обратите внимание на код ошибки 415. Здесь это говорит вам о чем-то важном. Вы неправильно указали значение заголовка content type.
2. Вы не можете передать идентификатор как свойство объекта body?
3. @AluanHaddad Хотел бы я, чтобы это было ТАК просто. Я ввел его здесь с ошибкой, но в postman все в порядке — я скопировал его. Спасибо
4. @Koga Я попробовал это. Та же неудача. Еще хуже
5. Я рад, что вы смогли найти проблему. Приветствия!
Ответ №1:
Попробовав несколько различных методов, я нашел способ сделать это и причину, по которой это не сработало.
Как упоминалось в вопросе — ODataController
был виновником в конце концов. Решение заключается в создании нового контроллера, производного от ApiController
и имеющего префикс с тем же маршрутом, что и исходный ODataController
контроллер
[RoutePrefix("api/someinterestingroute")]
И действие теперь выглядит следующим образом
[HttpPost]
[Route("{id}")]
public IHttpActionResult PostSome(int id, BodyModel model)
И теперь все мои части работают отлично. Усвоенный урок — не смешивайте действия, отличные от OData, с ODataController
. Хотя проблема заключалась в теле, а не в маршруте. Конечно, в маршрутизации и привязке OData есть что-то, что препятствовало ожидаемой привязке данных.
Ответ №2:
Обратите внимание здесь:
Content-Type: appliocation/json
вы написали это неправильно. Правильным является application / json
Комментарии:
1. Извините. Я написал это неправильно в вопросе, но не в реальном коде. Я исправил вопрос. Спасибо