Peta rute Anda mungkin kira-kira seperti ini:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
Tetapi untuk memiliki beberapa tindakan dengan metode http yang sama, Anda perlu memberi webapi informasi lebih banyak melalui rute seperti:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
Perhatikan bahwa routeTemplate sekarang termasuk tindakan. Banyak info lebih lanjut di sini: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Memperbarui:
Baiklah, sekarang saya pikir saya mengerti apa yang Anda cari di sini adalah satu lagi mengambil ini:
Mungkin Anda tidak memerlukan parameter url tindakan dan harus menjelaskan konten yang Anda cari dengan cara lain. Karena Anda mengatakan bahwa metode mengembalikan data dari entitas yang sama maka biarkan saja parameter yang menjelaskan untuk Anda.
Misalnya, dua metode Anda dapat diubah menjadi:
public HttpResponseMessage Get()
{
return null;
}
public HttpResponseMessage Get(MyVm vm)
{
return null;
}
Jenis data apa yang Anda berikan pada objek MyVm? Jika Anda hanya bisa melewati variabel melalui URI, saya akan menyarankan pergi rute itu. Kalau tidak, Anda harus mengirim objek di badan permintaan dan itu tidak terlalu HTTP Anda ketika melakukan GET (berfungsi meskipun, cukup gunakan [FromBody] infront dari MyVm).
Semoga ini menggambarkan bahwa Anda dapat memiliki beberapa metode GET dalam satu kontroler tanpa menggunakan nama tindakan atau bahkan atribut [HttpGet].
Pembaruan sebagai Web API 2.
Dengan konfigurasi API ini di file WebApiConfig.cs Anda:
Anda dapat merutekan kontroler kami seperti ini:
Di mana ControllerName adalah nama controller Anda (tanpa "controller"). Ini akan memungkinkan Anda untuk mendapatkan setiap tindakan dengan rute yang dijelaskan di atas.
Untuk bacaan lebih lanjut: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
sumber
Di Web API (secara default) metode dipilih berdasarkan kombinasi metode HTTP dan nilai rute .
MyVm
terlihat seperti objek yang kompleks, dibaca oleh formatter dari badan sehingga Anda memiliki dua metode yang identik dalam hal data rute (karena tidak satu pun dari mereka memiliki parameter dari rute) - yang membuatnya mustahil bagi operator (IHttpActionSelector
) untuk mencocokkan yang sesuai .Anda perlu membedakan mereka dengan parameter querystring atau rute untuk menyelesaikan ambiguitas.
sumber
Setelah banyak mencari di web dan berusaha mencari bentuk yang paling cocok untuk perutean peta jika sudah menemukan yang berikut ini
Pemetaan ini berlaku untuk pemetaan nama tindakan dan konvensi http dasar (GET, POST, PUT, DELETE)
sumber
Mungkin saja metode web Anda sedang diselesaikan ke url yang sama. Lihat tautan berikut: -
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Jadi, Anda mungkin perlu menambahkan nama metode Anda ke tabel routing Anda.
sumber
Tanpa menggunakan tindakan, pilihannya adalah:
pindahkan salah satu metode ke pengontrol yang berbeda, sehingga tidak berbenturan.
gunakan hanya satu metode yang mengambil param, dan jika itu nol panggil metode lain dari kode Anda.
sumber
Solusi ini bekerja untuk saya.
Harap tempatkan Route2 terlebih dahulu di WebApiConfig. Juga Tambahkan HttpGet dan HttpPost sebelum setiap metode dan sertakan nama pengontrol dan nama metode di url.
WebApiConfig =>
Pengendali =>
Url =>
sumber
Ini adalah jawaban untuk semua orang yang tahu semuanya benar dan telah memeriksa 50 kali .....
Pastikan Anda tidak berulang kali melihatnya
RouteConfig.cs
.File yang ingin Anda edit diberi nama
WebApiConfig.cs
Juga, seharusnya terlihat persis seperti ini:
Saya bisa menyelamatkan diri sekitar 3 jam.
sumber
Saya menemukan bahwa ketika saya memiliki dua metode Get, satu parameterless dan satu dengan tipe kompleks sebagai parameter saya mendapatkan kesalahan yang sama. Saya memecahkan ini dengan menambahkan parameter dummy dari tipe int, bernama Id, sebagai parameter pertama saya, diikuti oleh parameter tipe kompleks saya. Saya kemudian menambahkan parameter tipe kompleks ke templat rute. Berikut ini bekerja untuk saya.
Pertama dapatkan:
Kedua dapatkan:
WebApiConfig:
sumber
Ini dimungkinkan karena menggunakan pengontrol MVC alih-alih pengontrol API Web. Periksa namespace di kontroler Web API itu harus sebagai berikut
Jika namespace adalah sebagai berikut maka itu memberikan kesalahan di atas dalam pemanggilan metode pengontrol api web
sumber
Periksa Anda memiliki dua metode yang memiliki nama berbeda dan parameter yang sama.
Jika demikian harap hapus salah satu metode dan coba.
sumber
Saya menemukan masalah ini ketika mencoba menambah pengontrol WebAPI saya dengan tindakan ekstra.
Anggaplah Anda akan memilikinya
Sekarang ada dua metode yang memenuhi permintaan untuk / api / controller yang memicu masalah yang dijelaskan oleh TS.
Saya tidak ingin menambahkan parameter "dummy" ke tindakan tambahan saya, jadi saya melihat ke tindakan default dan menghasilkan:
untuk metode pertama dalam kombinasi dengan pengikatan rute "ganda":
Perhatikan bahwa meskipun tidak ada parameter "aksi" di templat rute pertama rupanya Anda masih dapat mengonfigurasi tindakan default yang memungkinkan kami untuk memisahkan perutean panggilan WebAPI "normal" dan panggilan ke tindakan ekstra.
sumber
Dalam Kasus saya Semuanya benar
1) Konfigurasi Web dikonfigurasi dengan benar 2) Rute awalan dan atribut Rute sudah benar
Masih saya mendapatkan kesalahan. Dalam kasus "Rute" atribut saya (dengan menekan F12) menunjuk ke System.Web.MVc tetapi tidak System.Web.Http yang menyebabkan masalah.
sumber
Anda dapat menambahkan
[Route("api/[controller]/[action]")]
ke kelas controller Anda.sumber
Saya tahu ini adalah pertanyaan lama, tetapi kadang-kadang, ketika Anda menggunakan sumber daya layanan seperti dari AngularJS untuk terhubung ke WebAPI, pastikan Anda menggunakan rute yang benar, jika tidak maka kesalahan ini terjadi.
sumber
Pastikan Anda TIDAK menghias metode Kontroler Anda untuk aksi GET | PUT | POST | DELETE default dengan atribut [HttpPost / Put / Get / Delete]. Saya telah menambahkan attibute ini ke action vanilla Post controller saya dan menyebabkan 404.
Semoga ini bisa membantu seseorang karena bisa sangat membuat frustrasi dan membuat kemajuan terhenti.
sumber
Misalnya => TestController
Jika Anda hanya dapat mengubah file WebApiConfig.cs.
Itu dia :)
Dan hasil:
sumber
Sudahkah Anda mencoba seperti:
sumber
HttpGet
atribut tidak memiliki konstruktor yang menerima argumen string.