ASP.NET Web Api – 使用Chunked Transfer Encoding时,框架不会将JSON转换为对象
我在Android中有一个http客户端将HTTP PUT请求发送到使用C#和ASP.NET WebApi框架实现的REST api。
只要JSON字段与C#类中的属性匹配,框架就应该能够将JSON神奇地转换(反序列化)到模型类(普通对象)中。
当http请求附带Chunked Transfer Encoding使Content-Length = 0(根据http://en.wikipedia.org/wiki/Chunked_transfer_encoding )并且框架无法映射其中的JSON时,问题就出现了。 Http请求消息,因此参数为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框架的魔力。 而且您知道规则: 您添加的代码越多,您可能会引入的错误就越多 。
有没有办法处理带有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;} }
我最近偶然发现了同样的问题,并设法为它创建了一个解决方法。 我使用了原始的JsonMediaTypeFormatter类,将其子类化并更新了ReadFromStreamAsync / ReadFromStream方法的实现。
https://gist.github.com/cobysy/578302d0f4f5b895f459
希望这可以帮助。
- 使用属性路由为Web Api构建URL视图
- WebAPI / Owin – 登录后未授权身份
- 具有非主键值的FindAsync
- entity framework在Web api / MVC中使用异步控制器进行处理
- ASP.NET Web API和OpenID Connect:如何从授权代码获取访问令牌
- 如何在HttpClient response.ReasonPhrase中获取真正的错误消息?
- WebApi,Autofac,System.Web.Http.Filters.ActionFilterAttribute每个请求的实例
- Fiddler测试API Post传递类
- HttpClient调用Windows-Authenication ApiController方法…但没有WindowsIdentity出现