ASP.NET Web Api: Sumber daya yang diminta tidak mendukung metode http 'GET'

93

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.)

Josh Schultz
sumber

Jawaban:

108

Jika Anda belum mengonfigurasi HttpMethod apa pun pada tindakan Anda di pengontrol, ini diasumsikan hanya HttpPost di RC. Dalam Beta, diasumsikan mendukung semua metode - GET, PUT, POST dan Delete. Ini adalah perubahan kecil dari beta ke RC. Anda dapat dengan mudah mendekore lebih dari satu metode http pada tindakan Anda dengan [AcceptVerbs ("GET", "POST")].

dinesh ravva
sumber
baru saja menemukan ini, terima kasih atas perbaikannya, tapi penasaran, mengapa saya harus melakukan ini dengan metode kustom saya, tetapi bukan metode "Dapatkan" default? Saya memiliki metode Get yang dibuat oleh templat untuk pengontrol, tetapi tidak didekorasi. apakah ini hanya berdasarkan kesepakatan karena nama Get?
SelAromDotNet
3
@ Josh: Ya! Ketika nama metode aksi dimulai dengan "Get ..." Anda tidak perlu menandainya sebagai metode GET. Baca lebih lanjut di sini: asp.net/web-api/overview/web-api-routing-and-actions/…
Jenny O'Reilly
Saya melakukan seperti yang disarankan dalam jawaban, tetapi sekarang kedua panggilan saya, Get dan Post, sedang dialihkan ke Get Action. Tolong bantu?
Syed Ali Taqi
55

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.

Eric
sumber
@Tokopedia Luar biasa, inilah alasan mengapa itu tidak berhasil untuk saya. Saya memiliki kata kerja pada tindakan saya tetapi dirujuk melalui Web. PVC jadi tidak berfungsi.
dreza
Hebat, Anda menyelamatkan hari saya
Hossein Narimani Rad
Terima kasih banyak, karena System.Web.Mvc tidak bagus untuk saya.
Burak Karakuş
34

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.

Carl Sharman
sumber
1
Jika ada yang menggunakan perutean url, coba lakukan seperti [Route ("{programmeId = programmeId: int}")]
sree
1
Ini untukku. WebApiConfig -> MapHttpRoutes memiliki -> routeTemplate: "api / {controller} / {id}", jadi parameter 'id' harus digunakan.
HockeyJ
1
jawaban Anda mengarahkan saya ke masalah saya yang sedikit berbeda. Saya mengubah nama satu parameter [FromUri] untuk metode tersebut dan tidak memperbaruinya di sisi klien
Matus
22

Jika Anda mendekorasi metode Anda dengan HttpGet, tambahkan yang berikut ini usingdi bagian atas pengontrol:

using System.Web.Http;

Jika Anda menggunakan System.Web.Mvc, maka masalah ini bisa terjadi.

Sohail xIN3N
sumber
5
Ini benar, dan konyolnya. NET tidak menampilkan pesan dengan jelas.
Teoman shipahi
15

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.

Jeremy
sumber
8

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" };
}
Shaakir
sumber
6

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.

Vern D.
sumber
3

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 }
                          );
Kazem Maleki
sumber
1

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.

Pierrick Martellière
sumber
0

Masalah saya sesederhana memiliki referensi null yang tidak muncul di pesan yang dikembalikan, saya harus men-debug API saya untuk melihatnya.

Ninos
sumber