为什么在使用 HttpClient posting 时我的 post 数据全部为空?

Why is my post data all null when posting with HttpClient?

我正在尝试 post 一个对象从客户端 Web 应用程序到所述客户端的 CRUD API。我正在使用以下代码发出 post 请求:

var respP = await _client.PostAsync("api/Persons", new StringContent(JsonConvert.SerializeObject(person), Encoding.UTF8, "application/json"));

而API动作方法很简单:

[HttpPost]
public async Task Post(Person person)
{
    _db.Add(person);
    await _db.SaveChangesAsync();
}

我在 _db.Add(person); 上有一个断点,当它被击中时,我看到我在 person 中有一个非空的 Person 实例,但所有字段都是默认值,即 nullables 为 null 等

我的 HttpClient 设置如下:

_client.BaseAddress = _config["Api:Url"];
_client.DefaultRequestHeaders.Clear();
_client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

我确实尝试将 person 参数类型设置为 string 以查看是否可以看到原始 JSON,但 person 参数本身为空。

我做错了什么?

已添加:Person class 如下所示:

public class Person
{
    [Key]
    public int PersonId { get; set; }

    [Required(AllowEmptyStrings = false)]
    [StringLength(128)]
    public string LastName { get; set; }

    [Required(AllowEmptyStrings = false)]
    [StringLength(128)]
    public string FirstName { get; set; }

    [Column(TypeName = "date")]
    public DateTime BirthDate { get; set; }

    [Required(AllowEmptyStrings = false)]
    [StringLength(13)]
    public string IdNumber { get; set; }
}

实际通过的JSON是:

{
  "PersonId": 0,
  "LastName": "df",
  "FirstName": "dfzg",
  "BirthDate": "2017-12-01T00:00:00",
  "IdNumber": "0000000000000"
}

您需要明确告诉框架到哪里寻找传入数据以绑定到模型。在参数上使用 [FromBody] 属性来绑定来自请求正文的数据

注意:接受用户输入的操作应检查 ModelState.IsValid 属性。

[HttpPost]
public async Task<IActionResult> Post([FromBody]Person person) {
    if(ModelState.IsValid) {
        _db.Add(person);
        await _db.SaveChangesAsync();
        return Ok();
    }
    return BadRequest();
}

引用Model Binding