Global.asax にデフォルトのルートがあります。
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
特定の機能をターゲットにできるようにしたかったので、別のルートを作成しました。
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/bycategoryid/5をすると、私が欲しいものを手に入れることができます。ただし、呼び出す.../api/records/1とエラーが発生します
要求に一致する複数のアクションが見つかりました: ...
その理由は理解できます。ルートは有効な URL を定義するだけですが、関数のマッチングに関しては、両方Get(int id)とByCategoryId(int id)matchapi/{controller}/{id}であり、これがフレームワークを混乱させます。
デフォルトの API ルートを再び機能させるにはどうすればよい{action}ですか? RecordByCategoryIdControllerデフォルトの API ルートに一致する名前の別のコントローラーを作成することを考えました.../api/recordbycategoryid/5。ただし、それは「汚い」(したがって不十分な)解決策であることがわかりました。私はこれに関する回答を探しましたが、{action}この問題について言及しているルートの使用に関するチュートリアルはありません。