ASP.NET Web Api: il framework non converte JSON in object quando si utilizza Chunked Transfer Encoding

Ho un client http in Android che invia richieste HTTP PUT a una API REST implementata con C # e framework ASP.NET WebApi.

Il framework dovrebbe essere in grado di convertire magicamente (deserializzare) il JSON in una class modello (object semplice) finché i campi JSON corrispondono alle proprietà nella class C #.

Il problema arriva quando le richieste http arrivano con Chunked Transfer Encoding che rende Content-Length = 0 (come per http://en.wikipedia.org/wiki/Chunked_transfer_encoding ) e il framework non è in grado di mappare il JSON che è all’interno del Messaggio di richiesta Http in modo che il parametro sia nullo.

Vedi questo semplice esempio:

[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; } 

Il problema è che i record sono nulli quando il client invia la richiesta http in blocco.

Come ho capito, la codifica Chunked Transfer è semplicemente una proprietà di trasferimento che il client o il server http non devono preoccuparsi del livello dell’applicazione (attività del livello di trasporto). Ma sembra che il framework non lo gestisca come vorrei.

Potrei recuperare manualmente il JSON da HttpRequestMessage e de-serializzarlo in un object MyData, ma non sarei in grado di sfruttare la magia del framework ASP.NET. E tu conosci la regola: più codice aggiungi più bug che potresti introdurre .

C’è un modo per gestire le richieste di Put Http con JSON che arrivano come trasferimento chunked codificato in ASP.NET Web Api 2 ?

EDIT : Questa è la class del modello per questo esempio che il framework dovrebbe creare un’istanza quando si effettua la serializzazione del JSON

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

Recentemente mi sono imbattuto nello stesso problema e sono riuscito a creare una soluzione alternativa. Ho preso la class JsonMediaTypeFormatter originale, la ho sottoclassata e aggiornato l’implementazione del metodo ReadFromStreamAsync / ReadFromStream.

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

Spero che questo ti aiuti.