C#.net核心web api post参数始终为null

时间:2017-04-03 18:42:54

标签: c# .net asp.net-core asp.net-web-api-routing asp.net-core-webapi

所以这让我疯了。我正在做一些非常简单的向我的网络API发送POST请求的事情。端点设置如下:

[HttpPost]
[Route("locations")]
public async Task<IActionResult> PostLocations([FromBody]IEnumerable<Location>locations)

我按照以下方式拨打电话:

http://localhost:60254/api/Fetch/locations
With the body 
{
  "Locations": [
    { 
        "LocationId": "111", 
        "ProductId": 110, 
        "Sku": "11131-LJK" 
    }
  ]
}

And header: content-type: application/json

现在再一次,这是非常简单的事情,应该开箱即用,这种毛茸茸的框架变化正在弄乱一切。

现在,如果我获得HttpContext并直接读取正文流

    using (StreamReader reader = new StreamReader(HttpContext.Request.Body, Encoding.UTF8))
    {
      string  body = reader.ReadToEnd();
    }

我可以看到身体被正确发送,我有一个超级良好的json,我可以转换成我想要的任何东西。所以问题是我错过了什么,这个端点不起作用?

Web api项目模板没有开箱即可添加哪些配置?

3 个答案:

答案 0 :(得分:4)

您的有效负载不是Location的列表,而是具有Locations属性列表的对象。

而不是

{
  "Locations": [
   { 
      "LocationId": "111", 
      "ProductId": 110, 
      "Sku": "11131-LJK" 
   }
 ]
}

使用

 [
   { 
     "LocationId": "111", 
     "ProductId": 110, 
     "Sku": "11131-LJK" 
   }
 ]

答案 1 :(得分:0)

不传递json对象,传递字符串化的对象:

var location = [
{ 
 "LocationId": "111", 
 "ProductId": 110, 
 "Sku": "11131-LJK" 
  }
]
var dataToPost = JSON.stringify(location);

答案 2 :(得分:0)

对于其他人......确保您的[FromBody]模型和所有子类都具有无参数构造函数