Действие веб-Api не вызывается при наличии тела. Но работает без тела

#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. Извините. Я написал это неправильно в вопросе, но не в реальном коде. Я исправил вопрос. Спасибо