8

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

1 に答える 1

7

最近、同じ問題に出くわし、回避策を作成することができました。元の JsonMediaTypeFormatter クラスを使用してサブクラス化し、ReadFromStreamAsync/ReadFromStream メソッドの実装を更新しました。

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

お役に立てれば。

于 2015-09-03T16:48:44.653 に答える