web-dev-qa-db-ja.com

ASP.NET Web APIコントローラーへの明示的なアクションルートの追加

ApiControllerエンドポイントに次のアクションを提供するUserを含むASP.NET Web APIプロジェクトがあります。

GET /api/User
POST /api/User
DELETE /api/user

次のエンドポイントを提供したいと思います。

GET /api/user/metrics

ただし、コントローラーアクションを次のように定義すると、

[HttpGet]
public HttpResponseMessage Metrics()
{
    return null;
}

Multiple actions were found that match the request エラーメッセージ。

これが「純粋な」REST APIの定義に違反していることを理解していますが、これが私がそれをしたい方法です。HTTPルートをマッピングすることによってこの問題を解決する必要があると想像しますが、いくつかのルートを試してみましたが、機能しません。

18
user2719100

デフォルトルートにはアクションは含まれません。

_routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
_

ルート内のコントローラー、HTTP動詞およびパラメーター、またはパラメーターの欠如に基づいてアクションを選択します。つまり、正しいコントローラを見つけて、パラメータのないGETアクションを探しています。 2つ見つかります。

アクションを含むルートを追加する必要があります。これは、Kiranが言及したように、属性ベースのルーティングを使用するか、慣例ベースのルーティングを使用して行われます。規約ベースのルーティングの場合、ルートは通常、_WebApiConfig.cs_のApplication_start()メソッドに配置されます。より具体的なルートは一般的なルートよりも優先されるため、ルートは次のようになります。

_config.Routes.MapHttpRoute(
                name: "ApiWithAction",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

 config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
_
19
clhereistian

Web API 2を使用している場合は、このようなシナリオでのエクスペリエンスを容易にする属性ルーティングを使用することをお勧めします。

ほとんどのシナリオでデフォルトの従来のルートを引き続き使用できますが、現在のシナリオのように、必要な場所で属性ルーティングを使用できます。

次のサンプルは、同様のシナリオを示しています。

http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/WebApiAttributeRoutingSample/WebApiAttributeRoutingSample/Controllers/Api/CustomersController.cs

17
Kiran Challa