web-dev-qa-db-ja.com

JSON HttpContentをASP.NET Web APIに投稿する

ASP.NET Web APIをホストしていて、http getリクエストに問題なくアクセスできるので、次のようにいくつかのパラメーターをPostAsyncリクエストに渡す必要があります。

var param = Newtonsoft.Json.JsonConvert.SerializeObject(new { id=_id, code = _code });
HttpContent contentPost = new StringContent(param, Encoding.UTF8, "application/json");

var response = client.PostAsync(string.Format("api/inventory/getinventorybylocationidandcode"), contentPost).Result;

この呼び出しは404 Not Found結果を返します。

サーバー側のAPIアクションは次のようになります。

[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode(int id, string code) {
...
}

そして、Web APIで私のルートを確認すると、次のようになります。

config.Routes.MapHttpRoute(
            name: "DefaultApiWithAction",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
);

JSON HttpContentを誤って渡していると思いますが、これがステータス404を返すのはなぜですか?

12
Leigh

404が表示されるのは、リクエストに対してフレームワークが実行するメソッドを見つけられなかったためです。デフォルトでは、Web APIは次のルールを使用してメソッドのパラメーターをバインドします。

  • パラメータが「シンプル」タイプの場合、Web APIはURIから値を取得しようとします。単純型には、.NETプリミティブ型(int、bool、doubleなど)、TimeSpan、DateTime、Guid、10進数、文字列、および文字列から変換できる型コンバーターを備えた任意の型が含まれます。 (型コンバーターについては後で詳しく説明します。)
  • 複合型の場合、Web APIは media-type formatter を使用して、メッセージ本文から値を読み取ろうとします。

これらのルールを前提として、POST本文からパラメーターをバインドする場合は、型の前に[FromBody]属性を追加するだけです。

[HttpPost]
public List<ItemInLocationModel> GetInventoryByLocationIDAndCode([FromBody] int id, string code) {
...
}

詳細については ドキュメントを参照してください

5