12

我有一个托管的 ASP.NET Web 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?

4

1 回答 1

5

您收到 404 的原因是框架没有找到根据您的请求执行的方法。默认情况下,Web API 使用以下规则来绑定方法中的参数:

  • 如果参数是“简单”类型,Web API 会尝试从 URI 中获取值。简单类型包括 .NET 基本类型(int、bool、double 等),加上 TimeSpan、DateTime、Guid、decimal 和 string,以及任何具有可以从字符串转换的类型转换器的类型。(稍后将详细了解类型转换器。)
  • 对于复杂类型,Web API 尝试使用媒体类型格式化程序从消息正文中读取值。

鉴于这些规则,如果您想绑定 POST 正文中的参数,只需[FromBody]在类型前面添加一个属性:

[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode([FromBody] int id, string code) {
...
}

有关详细信息,请参阅文档

于 2014-06-08T18:13:49.690 回答