Di Web API saya memiliki kelas struktur yang serupa:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Karena kami dapat memetakan masing-masing metode, sangat mudah untuk mendapatkan permintaan yang tepat di tempat yang tepat. Untuk kelas serupa yang hanya memiliki satu GET
metode tetapi juga memiliki Object
parameter, saya berhasil menggunakan IActionValueBinder
. Namun, dalam kasus yang dijelaskan di atas saya mendapatkan kesalahan berikut:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
Saya mencoba untuk mendekati masalah ini dengan mengganti ExecuteAsync
metode ApiController
tetapi tidak berhasil sejauh ini. Adakah saran untuk masalah ini?
Sunting: Saya lupa menyebutkan bahwa sekarang saya mencoba untuk memindahkan kode ini di ASP.NET Web API yang memiliki pendekatan berbeda untuk perutean. Pertanyaannya adalah, bagaimana cara membuat kode bekerja di ASP.NET Web API?
sumber
Jawaban:
Ini adalah cara terbaik yang saya temukan untuk mendukung metode GET tambahan dan mendukung metode REST normal juga. Tambahkan rute berikut ke WebApiConfig Anda:
Saya memverifikasi solusi ini dengan kelas tes di bawah ini. Saya berhasil mencapai setiap metode di controller saya di bawah ini:
Saya memverifikasi bahwa itu mendukung permintaan berikut:
Perhatikan bahwa jika tindakan GET tambahan Anda tidak dimulai dengan 'Dapatkan' Anda mungkin ingin menambahkan atribut HttpGet ke metode ini.
sumber
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
untukPut
metode saya jika tidak memberi saya 404.Pergi dari ini:
Untuk ini:
Karenanya, Anda sekarang dapat menentukan tindakan (metode) mana yang ingin Anda kirimi permintaan HTTP Anda.
posting ke "http: // localhost: 8383 / api / Command / PostCreateUser" memanggil:
dan memposting ke "http: // localhost: 8383 / api / Command / PostMakeBooking" memanggil:
Saya mencoba ini di aplikasi layanan WEB API yang di-host sendiri dan berfungsi seperti pesona :)
sumber
[HttpGet]
,[HttpPost]
, dll atribut untuk memetakan kata kerja ke metode.Saya menemukan atribut lebih bersih untuk digunakan daripada menambahkannya secara manual melalui kode. Ini adalah contoh sederhana.
Anda juga memerlukan ini di konfigurasi web Anda
Beberapa Tautan Baik http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api Yang ini menjelaskan perutean dengan lebih baik. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
sumber
config.MapHttpAttributeRoutes();
ke sayaWebApiConfig.cs
, danGlobalConfiguration.Configuration.EnsureInitialized();
pada akhirWebApiApplication.Application_Start()
metode saya untuk mendapatkan atribut rute untuk bekerja.config.MapHttpAttributeRoutes();
perlu muncul sebelum pemetaan rute (misconfig.Routes.MappHttpRoute(...
. Sebelumnya .Anda perlu menentukan rute lebih lanjut di global.asax.cs seperti ini:
sumber
Dengan Web Api 2 yang lebih baru menjadi lebih mudah untuk memiliki beberapa metode get.
Jika parameter yang diteruskan ke
GET
metode cukup berbeda untuk sistem perutean atribut untuk membedakan tipenya seperti halnya denganint
s danGuid
s, Anda dapat menentukan jenis yang diharapkan dalam[Route...]
atributSebagai contoh -
Untuk detail lebih lanjut tentang pendekatan ini, lihat di sini http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/
Pilihan lain adalah memberikan
GET
metode rute yang berbeda.Lihat di sini untuk perincian lebih lanjut - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
sumber
Di ASP.NET Core 2.0 Anda bisa menambahkan atribut Route ke controller:
sumber
Saya mencoba menggunakan perutean atribut Web Api 2 untuk memungkinkan beberapa metode Get, dan saya telah memasukkan saran yang bermanfaat dari jawaban sebelumnya, tetapi di Controller saya hanya menghiasi metode "khusus" (contoh):
... tanpa juga menempatkan [RoutePrefix] di bagian atas Controller:
Saya mendapatkan kesalahan yang menyatakan bahwa tidak ada rute yang ditemukan cocok dengan URI yang dikirimkan. Setelah saya memiliki [Rute] dekorasi metode serta [RoutePrefix] mendekorasi Controller secara keseluruhan, itu berhasil.
sumber
Saya tidak yakin apakah Anda telah menemukan jawabannya, tetapi saya melakukan ini dan itu berhasil
Sekarang di global.asx
sumber
Sudahkah Anda mencoba beralih ke WebInvokeAttribute dan mengatur Metode ke "GET"?
Saya percaya saya memiliki masalah yang sama dan beralih ke secara eksplisit mengatakan Metode mana (GET / PUT / POST / DELETE) yang diharapkan pada sebagian besar, jika tidak semua, metode saya.
WebGet harus menanganinya tetapi saya pernah melihatnya memiliki beberapa masalah dengan beberapa Dapatkan jauh lebih sedikit Dapatkan dari jenis pengembalian yang sama.
[Sunting: semua ini tidak berlaku dengan matahari terbenam WCF WebAPI dan migrasi ke ASP.Net WebAPI pada tumpukan MVC]
sumber
sumber
Alternatif malas / tergesa-gesa (Dotnet Core 2.2):
Memanggil mereka:
"hello42"
"world99"
sumber
Tidak satu pun dari contoh di atas yang berfungsi untuk kebutuhan pribadi saya. Di bawah ini adalah apa yang akhirnya saya lakukan.
Untuk menggunakan hal di atas dalam penggunaan rute Anda:
Apa yang terjadi adalah kendala jenis palsu dalam metode sehingga rute ini hanya akan cocok dengan metode GET, POST, PUT dan DELETE standar. "True" di sana mengatakan kami ingin memeriksa kecocokan item dalam array. Jika itu salah Anda akan mengatakan mengecualikan orang-orang di strYou kemudian dapat menggunakan rute di atas metode default ini seperti:
Di atas pada dasarnya mencari URL berikut =>
http://www.domain.com/Account/Status/Active
atau sesuatu seperti itu.Di luar di atas saya tidak yakin saya akan terlalu gila. Pada akhirnya itu harus per sumber daya. Tapi saya melihat perlunya memetakan url ramah karena berbagai alasan. Saya merasa cukup yakin karena Web Api berkembang akan ada semacam ketentuan. Jika waktu saya akan membangun solusi dan posting yang lebih permanen.
sumber
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
.Tidak dapat membuat salah satu solusi perutean di atas berfungsi - beberapa sintaks tampaknya telah berubah dan saya masih baru di MVC - dalam keadaan darurat meskipun saya mengumpulkan peretasan yang benar-benar mengerikan (dan sederhana) ini yang akan membuat saya oleh untuk sekarang - perhatikan, ini menggantikan metode "MyObject GetMyObjects (long id)" publik - kami mengubah tipe "id" menjadi string, dan mengubah tipe kembali ke objek.
sumber
Jika Anda memiliki beberapa Tindakan dalam file yang sama, maka berikan argumen yang sama, misalnya Id untuk semua Tindakan. Ini karena tindakan hanya dapat mengidentifikasi Id, Jadi alih-alih memberikan nama apa pun ke argumen, hanya menyatakan Id seperti ini.
sumber
Alternatif Sederhana
Cukup gunakan string kueri.
Rute
Pengendali
Permintaan
Catatan
Perlu diingat bahwa param string kueri tidak boleh "id" atau apa pun parameter di rute yang dikonfigurasi.
sumber
Ubah WebApiConfig dan tambahkan di akhir Routes.MapHttpRoute seperti ini:
Kemudian buat pengontrol seperti ini:
Ini adalah bagaimana saya menyelesaikannya. Saya harap ini akan membantu seseorang.
sumber