Post JSON HttpContent to ASP.NET Web API
У меня есть ASP.NET веб-API размещен и может получить доступ к HTTP get-запросам просто отлично, теперь мне нужно передать пару параметров в PostAsync-запрос, например:
var param = Newtonsoft.Json.JsonConvert.SerializeObject(new { id=_id, code = _code });
HttpContent contentPost = new StringContent(param, Encoding.UTF8, "application/json");
var response = client.PostAsync(string.Format("api/inventory/getinventorybylocationidandcode"), contentPost).Result;
Этот вызов возвращает результат 404 Not Found.
Действие API на стороне сервера выглядит следующим образом:
[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode(int id, string code) {
...
}
И просто для подтверждения моего маршрута в Web API выглядит так:
config.Routes.MapHttpRoute(
name: "DefaultApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Я предполагаю, что я неправильно передаю JSON HttpContent, почему это должно возвращать статус 404?
1 ответ:
Причина, по которой вы получаете 404, заключается в том, что фреймворк не нашел метода для выполнения данного запроса. По умолчанию Web API использует следующие правила для привязки параметров в методах:
- если параметр имеет "простой" тип, Web API пытается получить значение из URI. Простые типы включают .Чистая примитивных типов (int, bool, и двойной, и так далее), плюс сроки, дата и время, идентификатор GUID запятой, а строки, плюс любого типа с преобразователь типа, который может конвертировать из строки. (Подробнее о преобразователях типов чуть позже.)
- для сложных типов Web API пытается прочитать значение из тела сообщения, используя форматер медиа-типа.
Учитывая эти правила, если вы хотите привязать параметр из тела сообщения, просто добавьте атрибут
[FromBody]
перед типом:[HttpPost] public List<ItemInLocationModel> GetInventoryByLocationIDAndCode([FromBody] int id, string code) { ... }
Дополнительную информациюсмотрите в документации .