【问题标题】:ASP.NET Web Api - the framework is not converting JSON to object when using Chunked Transfer EncodingASP.NET Web Api - 使用分块传输编码时,框架未将 JSON 转换为对象
【发布时间】:2014-11-24 13:14:03
【问题描述】:

我在 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请求时records为null。

据我了解,分块传输编码只是http客户端或服务器在应用层(传输层的业务)不必担心的传输属性。但似乎框架并没有按照我的意愿管理它。

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

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

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

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

【问题讨论】:

  • 你有没有找到解决这个问题的方法?我遇到了同样的事情,除了降级到以前版本的 Web API 之外,还没有找到解决方案。
  • 不,我从来没有找到解决方案。
  • 再次签到!你有没有解决过这个问题?我看到了类似的东西。
  • 我没有用这种方法解决它没有..
  • 疯了。我必须在发送例程中更改了 JSON 配置中的某些内容,因为我所有的 POST 和 PUT 都立即停止工作,并且出现相同的症状。到达我的控制器后,HttpRequest 被分块,Content-Length 为 0。但如果我执行 ReadAsStringAsync(),我所有的 JSON 都在那里。并且...如果我从 PostOffice 调用相同的控制器方法,它不会被分块,并且对象参数为空。您选择了哪种解决方法?

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


【解决方案1】:

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

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

希望这会有所帮助。

【讨论】:

  • 我知道这有点老了,但您的简化版本似乎不起作用。它所要做的就是确保ContentLength 标头具有null 值,然后调用基本方法,这将导致相同的行为。我错过了什么吗?
  • 神奇的是,显然这就是全部。我在这里进一步简化了@softbear 的代码:gist.github.com/jayoungers/0b39b66c49bf974ba73d83943c4b218b
  • 那么确保调用者遵守规范的“正确”修复是什么? w3.org/Protocols/rfc2616/rfc2616-sec4.html .NET Core 中的 HttpClients 为我们造成了这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2012-10-25
  • 1970-01-01
  • 2012-11-02
相关资源
最近更新 更多