【问题标题】:Request Body is null in controller?控制器中的请求正文为空?
【发布时间】:2019-11-23 17:31:51
【问题描述】:

我正在使用 fetch 调用 POST 控制器操作,但在控制器中,主体似乎为空。

这是我的获取代码 sn-p - 这是在 .net 核心 Vue 项目中。这是一个打字稿文件。

var data = JSON.stringify(this.newProduct);
console.log(data)

fetch('api/Product/AddNewProduct', {
     method: 'POST',
     body: data,
     headers: {
         'Content-Type': 'application/json'
     }
}).then(res => res.json())
       .then(response => console.log('Success:', JSON.stringify(response)))
       .catch(error => console.error('Error:', error));

这是我在 Firefox 中看到的请求(和有效负载):

但在我的 .net 核心后端中,当 API 被命中时,我似乎无法获取请求中的正文或任何内容的值。

[HttpPost("[action]")]
public IActionResult AddNewProduct([FromBody] string body)
{
   Product newProduct;
   try
   {
     /*Added the below snippet for testing, not sure if actually necessary */
       using (var reader = new StreamReader(Request.Body))
       {
           var requestBody = reader.ReadToEnd();
           // Do something
        }

        //Convert the request body to an object
        newProduct = JsonConvert.DeserializeObject<Product>(body);
    }
    catch (Exception e)
        {
             return new BadRequestResult();
         }

这里,在我的调试器中,bodyrequestBody 都是空的。有任何想法吗?

【问题讨论】:

  • 不要再读了。它已经在您的方法参数中传递。
  • 我只是为了测试目的而阅读它,因为名为 body 的方法参数为空(根据我帖子的最后一行)。有什么想法吗?

标签: c# json asp.net-mvc vue.js .net-core


【解决方案1】:

.NET 没有看到您传递字符串,它看到的是 JSON,因为您传递了 application/jsonContent-Type 标头,因此它会尝试反序列化并将其映射到您的请求对象。在您的情况下,因为您的参数是 string body,解析器会尝试将 JSON 对象映射到您的 string 并失败 - 所以它通过了 null

您可以尝试将请求更改为将text/plain 作为content-type 传递(或删除content-type 标头)或将您的API 参数更改为您要发送的对象:

public IActionResult AddNewProduct([FromBody] Product newProduct)
{
    ...
}

【讨论】:

  • 太棒了,这解决了它。我将 API 参数更改为Product。谢谢!我不知道 .NET 总是自动反序列化 json 并尝试将其映射到请求对象。我认为这只是继承自ApiController 的控制器的一个功能。再次感谢!
  • @iaacp 不,.NET 不这样做。 ASP.NET Core 就是这样做的。 ASP.NET 是 .NET 的一部分。您需要研究这些差异。
【解决方案2】:

添加到标题接受

headers: {
    'Content-Type': 'application/json', 
    'Accept': 'application/json',
},

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2013-11-19
    • 2020-12-02
    • 1970-01-01
    • 2020-04-01
    • 2019-06-26
    • 2021-04-13
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多