控制器中的请求正文为空?

时间:2019-07-15 02:04:01

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

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

这是我的提取代码段-这在.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中看到的请求(和有效负载):

Request

但是在我的.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均为空。有任何想法吗?

2 个答案:

答案 0 :(得分:1)

.NET没有看到您传递字符串,而是看到了JSON,因为您传递了Content-Type的{​​{1}}标头,因此它将尝试反序列化并将其映射到您的请求对象。在您的情况下,由于参数为application/json,因此解析器尝试将JSON对象映射到您的string body并失败-因此它传递了string

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

content-type

答案 1 :(得分:0)

添加到标题接受

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