ASP.NET Web Api-当使用分块传输编码时,框架没有将JSON转换为对象

本文关键字:框架 JSON 对象 转换 编码 Api- Web NET 传输 ASP | 更新日期: 2023-09-27 18:24:58

我在Android中有一个http客户端,它将http PUT请求发送到用C#和ASP.NET WebApi框架实现的RESTapi。

只要JSON字段与C#类中的属性匹配,框架就应该能够神奇地将JSON转换(反序列化)为模型类(普通对象)。

当http请求带有Chunked Transfer Encoding时,问题就出现了,该编码使内容长度为0(根据http://en.wikipedia.org/wiki/Chunked_transfer_encoding)并且框架无法映射Http请求消息中的JSON,因此参数为null。

看看这个简单的例子:

    [HttpPut]
    public HttpStatusCode SendData(int id, int count, [FromBody]MyData records, HttpRequestMessage requestMessage)
    {
        var content = requestMessage.Content;
        string jsonContent = content.ReadAsStringAsync().Result; //this gets proper JSON
        return HttpStatusCode.OK;
    }

问题是,当客户端发送分块的http请求时,记录为空。

据我所知,Chunked Transfer编码只是http客户端或服务器在应用层(传输层的业务)不必担心的一个传输属性。但这个框架似乎并没有像我希望的那样管理它。

我可以手动从HttpRequestMessage中检索JSON,并将其反序列化为MyData对象,但我无法利用ASP.NET框架的魔力。你知道规则:你添加的代码越多,你可能引入的bug就越多

是否有任何方法可以使用JSON处理Http-Put请求,这些请求是在ASP.NET Web Api 2中编码的分块传输?

EDIT:这是本例的模型类,框架在反序列化JSON 时应该实例化它

public class MyData
{
    public string NamePerson {get; set;}
    public int Age {get; set;}
    public string Color {get; set;}
}

ASP.NET Web Api-当使用分块传输编码时,框架没有将JSON转换为对象

我最近偶然发现了同样的问题,并设法为其创建了一个变通方法。我采用了原始的JsonMediaTypeFormatter类,将其子类化,并更新了ReadFromStreamAsync/ReadFromStream方法的实现。

https://gist.github.com/cobysy/578302d0f4f5b895f459

希望这能有所帮助。