【问题标题】:C# .net core web api post parameter always nullC# .net core web api post 参数始终为空
【发布时间】:2017-08-28 18:11:18
【问题描述】:

所以这让我发疯了。我正在做一些非常简单的事情,将 POST 请求发送到我的 web api。端点设置如下:

[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 项目模板没有添加开箱即用的配置以使其正常工作?

【问题讨论】:

  • 这是一个问题 asp.net core 还是 asp.net web api?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    代替

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

    使用

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

    【讨论】:

    • 我尝试将其更改为` [ { "LocationId": "111", "ProductId": 110, "Sku": "11131-LJK" } ] ` 它也不起作用
    • 好吧,现在它可以工作了,不知道为什么在它没有正确获取数组之前。我猜是墨菲定律。谢谢。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-09
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多