IはGlobal.asaxの中にデフォルトルートを有する:ウェブAPIルーティング - API/{コントローラ}/{アクション}/{ID} "機能不全" API/{コントローラ}/{ID}
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Iを特定の機能をターゲットできるようにしたかったので、私は別のルートを作成しました:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
だから、私のコントローラでは、私が持っている:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
の呼び出しを私が欲しいものを私に与えるでしょう。しかし 、.../api/records/1
はエラー
複数のアクションが要求に一致することが判明し、私を与えるだろう呼び出す:つまり、なぜ私が理解
... - ルートはちょうどURLが有効であるかを定義しますが、ファンクションマッチングになると、Get(int id)
とByCategoryId(int id)
はapi/{controller}/{id}
と一致します。これはがというフレームワークを混乱させます。
デフォルトのAPIルートを再度使用するには、何をする必要がありますか?{action}
のままにしておきますか?私はRecordByCategoryIdController
という別のコントローラを作成してデフォルトのAPIルートに一致させることを考えましたが、そのためには.../api/recordbycategoryid/5
をリクエストします。しかし、私はそれが "汚い"(したがって不満足な)解決策であることがわかります。私はこれについての答えを探しましたが、{action}
のルートを使ってこの問題について言及しているチュートリアルはありません。
私は上記のアドバイスを試しましたが、すべてが期待通りに機能します。その "秘密"をありがとうございました。 –
あなたの答えの2番目の点で、 'id'がオプションの場合、' WithActionApi'ルートに一致するアクションが見つからなければ '/ api/{part1}/{part2}'のようなURLは 'DefaultApi'ルートに入ります。私が間違っているなら、私を修正してください。 – orad