c# - ASP.NET Web Api - 使用分块传输编码时,框架不会将 JSON 转换为对象

标签 c# json asp.net-web-api chunked-encoding http-content-length

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

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

当 http 请求带有使 Content-Length = 0 的分块传输编码(根据 http://en.wikipedia.org/wiki/Chunked_transfer_encoding )并且框架无法映射 Http 请求消息中的 JSON 因此参数为空。

看这个简单的例子:

    [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 框架的魔力。您知道规则:添加的代码越多,可能引入的错误就越多

有什么方法可以处理在 ASP.NET Web Api 2 中以分块传输形式编码的 JSON 的 Http Put 请求

编辑:这是本示例的模型类,框架在反序列化 JSON 时应实例化

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

最佳答案

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

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

希望这对您有所帮助。

关于c# - ASP.NET Web Api - 使用分块传输编码时,框架不会将 JSON 转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111850/

相关文章:

json - d3.js svg 从 (geo/topo)json 绘制轮廓线

c# - .Net Web Api 2.2 端点中的依赖注入(inject)不可用

xamarin - ASP.NET Core Web API 与 ASP.NET Core 应用程序

c# - 未为 WS 2008 R2 上的命名管道设置句柄

c# - C#与Java通信:Process

c# - 以美观的方式获得最长和最短的弦

java - 将 json 参数发布到 REST 服务时出错

json - 如何在转换json时增加一个数字

c# - 无法解析对程序集 'PostSharp' 的依赖性,因为它尚未预加载