web-dev-qa-db-ja.com

Web API 2ルーティング-ルート属性

質問は、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プロジェクトでもあることに注意してください。私が見逃していること、間違っていることなどがありますか?複数のパラメーターを渡す方法を定義する投稿が多数あることは知っていますが、私の質問は、一方が機能し、もう一方が機能しない理由についてもう少し具体的だと思います。

9
Rob Scott

config.MapHttpAttributeRoutes()を呼び出す必要があります。

これにより、すべてのControllerクラスが解析され、属性からルートが派生します。

これを標準のルーティングと混ぜることはしません。

15
toadflakz

ASP.NET Web API 2の属性ルーティング

属性ルーティングの有効化

属性ルーティングを有効にするには、構成中に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 }
        );
    }
}
7
Nkosi