Die angeforderte Ressource unterstützt die HTTP-Methode 'GET' nicht.

102

Meine Route ist korrekt konfiguriert und meine Methoden haben das dekorierte Tag. Ich erhalte immer noch die Meldung "Die angeforderte Ressource unterstützt die HTTP-Methode 'GET' nicht".

[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";
}

Hier sind meine Routen:

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
quelle

Antworten:

226

Bitte verwenden Sie die Attribute aus dem System.Web. HTTP- Namespace in Ihren WebAPI-Aktionen:

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

Der Grund, warum es nicht funktioniert, ist, dass Sie die Attribute verwendet haben, die aus dem MVC- Namespace stammen System.Web.Mvc. Die Klassen im System.Web.HttpNamespace sind für WebAPI .

Maggie Ying
quelle
11
Verdammt .. danke! Ich wollte gerade verrückt werden lol unglaublich, wie man Zeit mit so kleinen Dingen verschwenden kann ..
Rushino
1
In der Tat ist hier sicherlich eine Erklärung notwendig, warum dies die richtige Antwort ist!
Jaxidian
6
Bearbeitete Antwort mit Erklärung.
Maggie Ying
2
Kann ich [System.Web.Http.AcceptVerbs ("GET", "POST")] und [System.Web.Http.HttpGet] in RouteConfig.cs angeben, damit ich dies nicht in jeder API hinzufügen muss.
Girish Gupta
8
Warum musste ich dies in nur einem meiner 10 Apis für dieses Projekt tun? Ich habe die API genauso erstellt wie in den anderen 9 APIs. Wie frustrierend.
Dan Beaulieu
3

Verwenden Sie einfach dieses Attribut

[System.Web.Http.HttpGet]

brauche diese Codezeile nicht:

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

In meinem Fall unterschied sich die Routensignatur vom Methodenparameter. Ich hatte eine ID, aber ich akzeptierte documentId als Parameter, was das Problem verursachte.

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

Ich hatte das gleiche Problem. Ich hatte bereits 4 Controller, die einwandfrei funktionierten, aber als ich diesen hinzufügte, wurde "Die angeforderte Ressource unterstützt die HTTP-Methode 'GET' nicht" zurückgegeben. Ich habe hier und in einigen anderen relevanten Artikeln alles versucht, war der Lösung jedoch gleichgültig, da, wie Dan B. als Antwort auf die Antwort erwähnte, bereits andere gut funktionierten.

Ich ging eine Weile weg, kam zurück und stellte sofort fest, dass der Controller beim Hinzufügen unter der Klasse "Controller" und nicht unter der Klasse "ApiController" verschachtelt war, unter der sich meine anderen Controller befanden. Ich gehe davon aus, dass ich die falsche Gerüstoption gewählt habe, um die CS-Datei in Visual Studio zu erstellen. Also habe ich den System.Web.Http-Namespace eingefügt, die übergeordnete Klasse geändert und alles funktioniert ohne die zusätzlichen Attribute oder das Routing.

Cameron
quelle