質問は、Route
属性を使用してカスタムルートを定義することに関するものです。
WebApiConfig
クラスでは、常にデフォルトルートを定義することを知っています。
configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
new { id = RouteParameter.Optional });
私が働かないのは、別のパラメーターを渡したいときです。私はこれを行うことができることを知っています(以下のコードは上記のデフォルトルートの下に定義されています):
//configuration.Routes.MapHttpRoute(
// name: "GetBrandImagePaths",
// routeTemplate: "api/{controller}/{id}/{type}");
しかし、WebApiConfig
ファイルでこれらすべてのルートを定義する代わりに、カスタムルーティングを使用したいと思います。 ただし、ファイル内に上記のコメント化されたコードがない場合、404が返されます。カスタムRoute
が見られていないと思うようになります。
public class HelperApiController : ApiController
{
[HttpGet]
[Route("api/helperapi/{id}/{type}")]
public string GetBrandImages(int id, string type)
{
.....
}
}
WebApiConfig
ファイルで定義されたルートを使用し、個々のAPIコントローラー内でカスタムルートを定義できるようにするにはどうすればよいですか。
このプロジェクトは(WebApiだけでなく)MVCプロジェクトでもあることに注意してください。私が見逃していること、間違っていることなどがありますか?複数のパラメーターを渡す方法を定義する投稿が多数あることは知っていますが、私の質問は、一方が機能し、もう一方が機能しない理由についてもう少し具体的だと思います。
config.MapHttpAttributeRoutes()
を呼び出す必要があります。
これにより、すべてのController
クラスが解析され、属性からルートが派生します。
これを標準のルーティングと混ぜることはしません。
属性ルーティングの有効化
属性ルーティングを有効にするには、構成中にMapHttpAttributeRoutesを呼び出します。この拡張メソッドは、System.Web.Http.HttpConfigurationExtensionsクラスで定義されています。
using System.Web.Http; namespace WebApplication { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API routes config.MapHttpAttributeRoutes(); // Other Web API configuration not shown. } } }
属性ルーティングは、コンベンションベースのルーティングと組み合わせることができます。規則ベースのルートを定義するには、MapHttpRouteメソッドを呼び出します。
public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Attribute routing. config.MapHttpAttributeRoutes(); // Convention-based routing. config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }