1. ホーム
  2. c#

[解決済み] WebApiコントローラでHttpContentを読み込む

2023-05-26 10:50:53

質問

MVC webApi コントローラのアクションで、PUT リクエストの内容を読み取るにはどうすればよいですか。

[HttpPut]
public HttpResponseMessage Put(int accountId, Contact contact)
{
    var httpContent = Request.Content;
    var asyncContent = httpContent.ReadAsStringAsync().Result;
...

ここで空文字列が表示されます :(

私がしなければならないことは、最初のリクエストでどのプロパティが変更され、送信されたかを把握することです(つまり、もし Contact オブジェクトが 10 個のプロパティを持っていて、そのうちの 2 個だけを更新したい場合、2 個のプロパティだけを持つオブジェクトを送信する、というようなことです。

{

    "FirstName": null,
    "LastName": null,
    "id": 21
}

期待される最終結果は

List<string> modified_properties = {"FirstName", "LastName"}

どのように解決するのですか?

設計上、ASP.NET Web APIのボディコンテンツは、一度だけ読み取ることができる前方のみのストリームとして扱われます。

あなたの場合、最初の読み込みはWeb APIがモデルをバインドするときに行われ、その後に Request.Content は何も返しません。

を削除することができます。 contact を削除し、コンテンツを取得してオブジェクトに手動でデシリアライズします (たとえば Json.NET を使用します)。

[HttpPut]
public HttpResponseMessage Put(int accountId)
{
    HttpContent requestContent = Request.Content;
    string jsonContent = requestContent.ReadAsStringAsync().Result;
    CONTACT contact = JsonConvert.DeserializeObject<CONTACT>(jsonContent);
    ...
}

これでうまくいくはずです(仮に accountId はURLパラメータなので、コンテンツ読み取りとして扱われないと仮定します)。