属性ルーティングの使用について調べましたか? 現在、MapHttpRoute で使用していたデフォルトの /controller/action タイプのルートを完全に削除するまで、属性ルーティングを広範囲に使用しています。
代わりに、コントローラーを次のように装飾します。最初に、コントローラーのルート プレフィックスを作成して、必要なベース ルートが何であるかを確認します。
/// <summary> A controller for handling products. </summary>
[RoutePrefix("api/purchasing/locations/{locationid}/products")]
public class ProductsController : PurchasingController
{
次に、コントローラーの各アクションを次のように装飾します。
[Route("", Name = "GetAllProducts")]
public IHttpActionResult GetAllProducts(int locationid, ODataQueryOptions<FourthPurchasingAPI.Models.Product> queryOptions)
{
IList<Product> products = this.GetProducts(locationid);
と
[Route("{productid}", Name = "GetProductById")]
public IHttpActionResult GetProduct(int locationid, string productid)
{
Product product = this.GetProductByID(locationid, productid);
したがって、api/purchasing/locations/1/products/への呼び出しは「GetAllProducts」という名前のルートに解決され、api/purchasing/locations/1/products/1 への呼び出しは「GetProductById」という名前のルートに解決されます。
次に、コントローラーで同じ署名を使用して別の GetProduct アクションを作成できます。属性ルートを適切に設定するだけです。
[Route("/department/{departmentId}", Name = "GetAllProductsForDepartment")]
public IHttpActionResult GetAllProductsWithDeptId(int locationid, int departmentId)
{
IList<Product> products = this.GetProducts(locationid, departmentId);
api/purchasing/locations/1/products/department/1234への呼び出し は、「GetAllProductsForDepartment」という名前のルートに解決されます。
この例では Web Api 2 を使用していることはわかっていますが、Web Api の属性ルーティングに関するこのリンクを参照してください。IHttpActionResult 以外のものを返す代わりに、まったく同じである必要があります。