将JSON反序列化为自定义类返回null

时间:2017-08-28 14:16:27

标签: c# asp.net-mvc asp.net-mvc-4

我有一个带有两个微服务的MVC应用程序。在第一个我调用PostAsync()方法来发送我的自定义对象

public class Logo { 
    public Guid Id { get; set; } 
    public IEnumerable<byte> Content { get; set; } 
}

到另一个服务

public async Task PostLogo(Logo logo)
    {
        using (var client = new HttpClient())
        {
            await client.PostAsync(_url, new StringContent(JsonConvert.SerializeObject(logo), Encoding.UTF8, "application/json"));
        }
    }

在第二个微服务中,我尝试使用

进行反序列化
[HttpPost, Route("logo")]
    public Task<FileUploadResultModel> SaveAsync([FromBody]Logo model)
    {            
        return _fileService.SaveAsync(null);
    }

但它变为null而不是输入对象

enter image description here

有人可以解释如何使用Post请求发送/处理自定义对象吗?

1 个答案:

答案 0 :(得分:1)

更新操作以遵循首选语法结构。

[HttpPost, Route("logo")]
public async Task<IHttpActionResult> SaveAsync([FromBody]Logo model) {
    if(ModelState.IsValid) {
        FileUploadResultModel result = await _fileService.SaveAsync(model);
        return Ok(result);
    }
    return BadRequest();
}

根据注释,字节数组可能太大,因此模型绑定器无法正确绑定模型。检查 web.config ,查看可以发送的最大数据大小。您可能需要增加它。最大值是2GB,但我建议不要这么高的值。

检查此答案:Maximum request length exceeded

如果您能够缩小图像,则应该将base64 Url编码为字符串并将其作为内容发送。

public class Logo { 
    public Guid Id { get; set; } 
    public string Content { get; set; } 
}

当你得到模型时,将内容转换回字节数组

[HttpPost, Route("logo")]
public async Task<IHttpActionResult> SaveAsync([FromBody]Logo model) {
    if(ModelState.IsValid) {
        byte[] content = Convert.FromBase64String(model.Content);
        var id = model.Id;
        //...
        return Ok(result);
    }
    return BadRequest();
}