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ルートをマッピングすることによってこの問題を解決する必要があると想像しますが、いくつかのルートを試してみましたが、機能しません。
デフォルトルートにはアクションは含まれません。
_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 }
);
_
Web API 2を使用している場合は、このようなシナリオでのエクスペリエンスを容易にする属性ルーティングを使用することをお勧めします。
ほとんどのシナリオでデフォルトの従来のルートを引き続き使用できますが、現在のシナリオのように、必要な場所で属性ルーティングを使用できます。
次のサンプルは、同様のシナリオを示しています。