Saya mulai menggunakan proyek API Web MVC4, saya punya controller dengan banyak HttpPost
metode. Controller terlihat seperti berikut:
Pengendali
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Di sini MyRequestTemplate
mewakili kelas templat yang bertanggung jawab untuk menangani Json yang datang melalui permintaan.
Kesalahan:
Ketika saya membuat permintaan menggunakan Fiddler untuk http://localhost:52370/api/VTRouting/TSPRoute
atau http://localhost:52370/api/VTRouting/Route
saya mendapatkan kesalahan:
Beberapa tindakan ditemukan yang sesuai dengan permintaan
Jika saya menghapus salah satu metode di atas berfungsi dengan baik.
Global.asax
Saya telah mencoba memodifikasi tabel routing default global.asax
, tetapi saya masih mendapatkan kesalahan, saya pikir saya memiliki masalah dalam mendefinisikan rute di global.asax. Inilah yang saya lakukan di global.asax.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Saya membuat permintaan di Fiddler menggunakan POST, melewati json di RequestBody for MyRequestTemplate.
Solusi yang jauh lebih baik untuk masalah Anda adalah menggunakan
Route
yang memungkinkan Anda menentukan rute pada metode dengan penjelasan:sumber
Route
danTSPRoute
?menggunakan:
itu bukan pendekatan RESTful lagi, tetapi Anda sekarang dapat memanggil tindakan Anda dengan nama (daripada membiarkan Web API secara otomatis menentukan satu untuk Anda berdasarkan kata kerja) seperti ini:
Bertentangan dengan kepercayaan populer, tidak ada yang salah dengan pendekatan ini, dan itu tidak menyalahgunakan Web API. Anda masih dapat memanfaatkan semua fitur luar biasa dari Web API (mendelegasikan penangan, negosiasi konten, mediatype formatters dan sebagainya) - Anda baru saja membuang pendekatan RESTful.
sumber
Titik api web (pengontrol) adalah satu sumber daya tunggal yang menerima kata kerja get / post / put / delete. Ini bukan pengontrol MVC normal.
Seharusnya, di
/api/VTRouting
sana hanya ada satu metode HttpPost yang menerima parameter yang Anda kirim. Nama fungsi tidak masalah , selama Anda mendekorasi dengan barang-barang [http]. Tapi saya belum pernah mencoba.Sunting: Ini tidak berfungsi. Dalam menyelesaikannya, tampaknya pergi dengan jumlah parameter, tidak mencoba model-bind ke tipe.
Anda dapat membebani fungsi untuk menerima parameter yang berbeda. Saya cukup yakin Anda akan baik-baik saja jika Anda menyatakannya seperti yang Anda lakukan, tetapi menggunakan parameter yang berbeda (tidak kompatibel) dengan metode. Jika paramsnya sama, Anda kurang beruntung karena penjilidan model tidak akan tahu yang Anda maksud.
Bagian ini berfungsi
Template default yang mereka berikan ketika Anda membuat yang baru membuatnya cukup eksplisit, dan saya akan mengatakan Anda harus tetap dengan konvensi ini:
Jika Anda ingin membuat satu kelas yang melakukan banyak hal, untuk penggunaan ajax, tidak ada alasan besar untuk tidak menggunakan pola pengontrol / tindakan standar. Satu-satunya perbedaan nyata adalah tanda tangan metode Anda tidak cantik, dan Anda harus membungkusnya
Json( returnValue)
sebelum mengembalikannya.Edit:
Overloading berfungsi dengan baik saat menggunakan templat standar (diedit untuk disertakan) saat menggunakan tipe sederhana. Saya telah pergi dan menguji sebaliknya, dengan 2 objek khusus dengan tanda tangan yang berbeda. Tidak pernah bisa membuatnya bekerja.
Ini bekerja untuk saya dalam hal ini, lihat di mana itu membuat Anda. Pengecualian hanya untuk pengujian.
Dan disebut seperti ini dari konsol:
sumber
Dimungkinkan untuk menambahkan beberapa metode Get dan Post di Web API Controller yang sama. Di sini Rute default yang Menyebabkan Masalah. API Web memeriksa Rute Pencocokan dari Atas ke Bawah dan Karenanya Rute Default Anda Cocok untuk semua Permintaan. Sesuai rute default, hanya satu Metode Get and Post yang dimungkinkan dalam satu controller. Baik tempatkan kode berikut di atas atau Komentar Keluar / Hapus Rute Default
sumber
Letakkan Rute Awalan [RoutePrefix ("api / Profiles")] di tingkat pengontrol dan letakkan rute di metode tindakan [Rute ("SukaProfil")]. Tidak perlu mengubah apa pun di file global.asax
sumber
Saya pikir pertanyaannya sudah dijawab. Saya juga mencari sesuatu pengontrol webApi yang memiliki mehtods yang sama tetapi nama yang berbeda. Saya mencoba menerapkan Kalkulator sebagai WebApi. Kalkulator memiliki 4 metode dengan tanda tangan yang sama tetapi nama yang berbeda.
dan dalam file WebApiConfig yang sudah Anda miliki
Cukup atur otentikasi / otorisasi pada IIS dan Anda selesai!
Semoga ini membantu!
sumber
Anda dapat menggunakan pendekatan ini:
sumber
Saya tidak yakin apakah metode get / post overloading melanggar konsep restfull api, tetapi workds. Kalau ada yang bisa mencerahkan tentang hal ini. Bagaimana jika saya memiliki uri sebagai
jadi seperti yang Anda lihat jurnal saya semacam aggregateroot, meskipun saya dapat menentukan pengontrol lain untuk publikasi semata-mata dan memberikan nomor publikasi pada url saya, tetapi ini memberi jauh lebih masuk akal. karena publikasi saya tidak akan ada tanpa jurnal itu sendiri.
sumber
Saya baru saja menambahkan "action = action_name" ke url dan dengan cara ini mesin perutean tahu tindakan apa yang saya inginkan. Saya juga menambahkan Atribut ActionName ke tindakan tetapi saya tidak yakin itu diperlukan.
sumber
Penjelasan terbaik dan paling sederhana yang saya lihat pada topik ini - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx
Saya berhasil hanya dengan Route, dan tidak perlu RoutePrefix.
Misalnya, di controller
dan
Kemudian, nama fungsi digunakan dalam jquery sebagai -
atau
sumber