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}
この問題について言及しているルートの使用に関するチュートリアルはありません。