C# および ASP.NET WebApi フレームワークで実装された REST API に HTTP PUT 要求を送信する Android の http クライアントがあります。
フレームワークは、JSON フィールドが C# クラスのプロパティと一致する限り、JSON をモデル クラス (プレーン オブジェクト) に魔法のように変換 (逆シリアル化) できる必要があります。
問題は、http 要求に Content-Length = 0 になる Chunked Transfer Encoding が含まれており ( 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 要求を送信すると、レコードが null になることです。
私が理解しているように、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;}
}