Saya mendapat tindakan berikut di ApiController:
public string Something()
{
return "value";
}
Dan saya telah mengonfigurasi rute saya sebagai berikut:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Dalam versi beta, ini berfungsi dengan baik, tetapi saya baru saja memperbarui ke Kandidat Rilis terbaru dan sekarang saya melihat kesalahan pada panggilan seperti ini:
Sumber daya yang diminta tidak mendukung metode http 'GET'.
Mengapa ini tidak berfungsi lagi?
(Saya kira saya bisa menyingkirkan {action} dan hanya membuat banyak pengontrol, tapi itu terasa berantakan.)
sumber
Semua informasi di atas benar, saya juga ingin menunjukkan bahwa
[AcceptVerbs()]
anotasi ada di ruang nama System.Web.Mvc dan System.Web.Http.Anda ingin menggunakan System.Web.Http jika itu adalah pengontrol API Web.
sumber
Meskipun ini bukan jawaban untuk OP, saya memiliki kesalahan yang sama persis dari akar penyebab yang sama sekali berbeda; jadi jika ini membantu orang lain ...
Masalahnya bagi saya adalah parameter metode yang salah nama yang menyebabkan WebAPI merutekan permintaan secara tidak terduga. Saya memiliki metode berikut di ProgrammesController saya:
[HttpGet] public Programme GetProgrammeById(int id) { ... } [HttpDelete] public bool DeleteProgramme(int programmeId) { ... }
Permintaan DELETE ke ... / api / program / 3 tidak diarahkan ke DeleteProgramme seperti yang saya harapkan, tetapi ke GetProgrammeById, karena DeleteProgramme tidak memiliki nama parameter id. GetProgrammeById kemudian tentu saja menolak HAPUS karena ditandai hanya menerima GET.
Jadi perbaikannya sederhana:
[HttpDelete] public bool DeleteProgramme(int id) { ... }
Dan semuanya baik-baik saja. Benar-benar kesalahan konyol tetapi sulit untuk di-debug.
sumber
Jika Anda mendekorasi metode Anda dengan
HttpGet
, tambahkan yang berikut iniusing
di bagian atas pengontrol:using System.Web.Http;
Jika Anda menggunakan
System.Web.Mvc
, maka masalah ini bisa terjadi.sumber
Ini tentunya merupakan perubahan dari Beta ke RC. Dalam contoh yang diberikan dalam pertanyaan, Anda sekarang perlu menghias tindakan Anda dengan [HttpGet] atau [AcceptVerbs ("GET")].
Ini menyebabkan masalah jika Anda ingin menggabungkan tindakan berbasis kata kerja (yaitu "GetSomething", "PostSomething") dengan tindakan berbasis non-kata kerja. Jika Anda mencoba menggunakan atribut di atas, ini akan menyebabkan konflik dengan tindakan berbasis kata kerja di pengontrol Anda. Salah satu cara untuk mendapatkan arount yang akan menentukan rute terpisah untuk setiap kata kerja, dan mengatur tindakan default ke nama kata kerja. Pendekatan ini dapat digunakan untuk menentukan sumber daya turunan di API Anda. Misalnya, kode berikut mendukung: "/ resource / id / children" di mana id dan children bersifat opsional.
context.Routes.MapHttpRoute( name: "Api_Get", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Get" }, constraints: new { httpMethod = new HttpMethodConstraint("GET") } ); context.Routes.MapHttpRoute( name: "Api_Post", routeTemplate: "{controller}/{id}/{action}", defaults: new { id = RouteParameter.Optional, action = "Post" }, constraints: new { httpMethod = new HttpMethodConstraint("POST") } );
Mudah-mudahan versi Web API yang akan datang memiliki dukungan yang lebih baik untuk skenario ini. Saat ini ada masalah yang dicatat di proyek codeplex aspnetwebstack, http://aspnetwebstack.codeplex.com/workitem/184 . Jika ini adalah sesuatu yang ingin Anda lihat, harap berikan suara untuk masalah tersebut.
sumber
Memiliki Setup yang sama dengan OP. Satu pengontrol dengan banyak tindakan ... kurang "berantakan" :-)
Dalam kasus saya, saya lupa "[HttpGet]" saat menambahkan tindakan baru.
[HttpGet] public IEnumerable<string> TestApiCall() { return new string[] { "aa", "bb" }; }
sumber
Masalah yang sama seperti di atas, tetapi root sangat berbeda. Bagi saya, itu adalah bahwa saya mencapai titik akhir dengan aturan penulisan ulang https. Menekannya di http menyebabkan kesalahan, bekerja seperti yang diharapkan dengan https.
sumber
Ganti kode berikut di jalur ini
Jalur:
App_Start => WebApiConfig.cs
Kode:
config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}/{Param}", defaults: new { id = RouteParameter.Optional, Param = RouteParameter.Optional } );
sumber
Saya tidak tahu apakah ini dapat terkait dengan posting OP tetapi saya kehilangan penjelasan [HttpGet] dan itulah yang menyebabkan kesalahan, seperti yang dinyatakan oleh metode @dinesh_ravva diasumsikan sebagai HttpPost secara default.
sumber
Masalah saya sesederhana memiliki referensi null yang tidak muncul di pesan yang dikembalikan, saya harus men-debug API saya untuk melihatnya.
sumber