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.
sumber
id
opsional maka URL like/api/{part1}/{part2}
mungkin masih masuk keDefaultApi
rute jika tidak ditemukan tindakan yang cocok untukWithActionApi
rute. Harap perbaiki saya jika saya salah.Anda dapat mengatasi masalah Anda dengan bantuan perutean atribut
Kontroler
URI di jquery
Konfigurasi Rute
dan perutean default Anda berfungsi sebagai perutean berbasis konvensi default
Kontroler
URI di Jquery
Konfigurasi Rute
Tinjau artikel untuk informasi lebih lanjut Perutean atribut dan perutean berbasis konvensi di sini & ini
sumber
Coba ini.
sumber
Kemungkinan alasannya juga karena Anda belum mewarisi Controller dari ApiController. Terjadi dengan saya butuh beberapa saat untuk memahami hal yang sama.
sumber
Untuk membedakan rute, coba tambahkan batasan bahwa id harus numerik:
sumber