Sumber daya yang diminta tidak mendukung metode HTTP 'GET'

103

Rute saya dikonfigurasi dengan benar, dan metode saya memiliki tag yang didekorasi. Saya masih mendapatkan pesan "Sumber daya yang diminta tidak mendukung metode HTTP 'GET'"?

[System.Web.Mvc.AcceptVerbs("GET", "POST")]
[System.Web.Mvc.HttpGet]
public string Auth(string username, string password)
{
  // Décoder les paramètres reçue.
  string decodedUsername = username.DecodeFromBase64();
  string decodedPassword = password.DecodeFromBase64();

  return "value";
}

Inilah rute saya:

config.Routes.MapHttpRoute(
    name: "AuthentificateRoute",
    routeTemplate: "api/game/authentificate;{username};{password}",
    defaults: new { controller = "Game",
                    action = "Auth", 
                    username = RouteParameter.Optional, 
                    password = RouteParameter.Optional },
    constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { controller = "Home", id = RouteParameter.Optional }
);
Rushino
sumber

Jawaban:

227

Silakan gunakan atribut dari System.Web. Namespace http pada tindakan WebAPI Anda:

    [System.Web.Http.AcceptVerbs("GET", "POST")]
    [System.Web.Http.HttpGet]
    public string Auth(string username, string password)
    {...}

Alasan mengapa ini tidak berhasil adalah karena Anda menggunakan atribut yang berasal dari namespace MVCSystem.Web.Mvc . Kelas di System.Web.Httpnamespace adalah untuk WebAPI .

Maggie Ying
sumber
11
Sial .. terima kasih! Saya baru saja akan menjadi gila lol luar biasa bagaimana Anda bisa membuang waktu untuk hal-hal kecil ..
Rushino
1
Memang, penjelasan mengapa ini adalah jawaban yang benar tentu diperlukan di sini!
Jaxidian
6
Jawaban diedit dengan penjelasan.
Maggie Ying
2
dapatkah saya menentukan [System.Web.Http.AcceptVerbs ("GET", "POST")] dan [System.Web.Http.HttpGet] di RouteConfig.cs sehingga saya tidak perlu menambahkan ini di setiap API.
Girish Gupta
8
Mengapa saya perlu melakukan ini hanya di salah satu dari 10 apis saya untuk proyek ini? Saya membuat api dengan cara yang persis sama seperti di 9 api lainnya. Betapa frustrasinya.
Dan Beaulieu
3

gunakan saja atribut ini

[System.Web.Http.HttpGet]

tidak membutuhkan baris kode ini:

[System.Web.Http.AcceptVerbs("GET", "POST")]
Kashif Faraz
sumber
3

Dalam kasus saya, tanda tangan rute berbeda dari parameter metode. Saya memiliki id, tetapi saya menerima documentId sebagai parameter, yang menyebabkan masalah.

[Route("Documents/{id}")]   <--- caused the webapi error
[Route("Documents/{documentId}")] <-- solved
public Document Get(string documentId)
{
  ..
}
Armando Servin
sumber
diberkati :) +1
Shai Cohen
2

Saya mengalami masalah yang sama .. Saya sudah memiliki 4 pengontrol yang berjalan dan berfungsi dengan baik tetapi ketika saya menambahkan yang ini, ia mengembalikan "Sumber daya yang diminta tidak mendukung metode HTTP 'GET'". Saya mencoba semuanya di sini dan di beberapa artikel lain yang relevan tetapi tidak peduli dengan solusinya karena, seperti yang disebutkan Dan B. dalam menanggapi jawabannya, saya sudah memiliki artikel lain yang berfungsi dengan baik.

Saya pergi sebentar, kembali, dan segera menyadari bahwa ketika saya menambahkan Pengontrol, pengontrol itu berada di bawah kelas "Pengontrol" dan bukan kelas "ApiController" tempat Pengontrol saya yang lain berada. Saya berasumsi saya memilih opsi perancah yang salah untuk membangun file .cs di Visual Studio. Jadi saya menyertakan namespace System.Web.Http, mengubah kelas induk, dan semuanya bekerja tanpa atribut atau perutean tambahan.

Cameron
sumber