[解決済み] 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パラメータなので、コンテンツ読み取りとして扱われないと仮定します)。
関連
-
[解決済み】指定されたキャストが有効でない?
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] 'IEnumerable<SelectListItem>' 型の ViewData アイテムで、キーが国であるものは存在しない。
-
[解決済み] EntityTypeにキーが定義されていないエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み] ASP.NET MVCにおけるApiControllerとControllerの相違点
-
[解決済み】ASP.NET Web APIでコントローラからバイナリファイルを返す。
-
[解決済み】HttpClientのPostAsyncの第2パラメータにHttpContentを設定するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み】Sequence contains no matching element(シーケンスにマッチする要素がない
-
[解決済み】値をNULLにすることはできません。パラメータ名:source
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み] 関数を終了するには?
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】WebResource.axdとは何ですか?