Saya memiliki Route default di Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Saya ingin dapat menargetkan fungsi tertentu, jadi saya membuat rute lain:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Jadi, di pengontrol saya, saya memiliki:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Menelepon .../api/records/bycategoryid/5
akan memberi saya apa yang saya inginkan. Namun, menelepon .../api/records/1
akan memberi saya kesalahan
Beberapa tindakan ditemukan yang sesuai dengan permintaan: ...
Saya mengerti mengapa itu - rute hanya menentukan URL apa yang valid, tetapi ketika datang ke pencocokan fungsi, keduanya Get(int id)
dan ByCategoryId(int id)
cocok api/{controller}/{id}
, itulah yang membingungkan kerangka kerja.
Apa yang harus saya lakukan agar rute API default berfungsi kembali, dan mempertahankannya {action}
? Saya berpikir untuk membuat pengontrol berbeda yang diberi nama RecordByCategoryIdController
agar sesuai dengan rute API default, yang akan saya minta .../api/recordbycategoryid/5
. Namun, saya menemukan itu menjadi solusi yang "kotor" (dengan demikian tidak memuaskan). Saya telah mencari jawaban tentang ini dan tidak ada tutorial di luar sana tentang menggunakan rute {action}
bahkan dengan menyebutkan masalah ini.