ASP.NET-Web-API: Die angeforderte Ressource unterstützt die http-Methode 'GET' nicht.

92

Ich habe die folgende Aktion auf einem ApiController:

public string Something()
{
    return "value";
}

Und ich habe meine Routen wie folgt konfiguriert:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

In der Beta hat dies einwandfrei funktioniert, aber ich habe gerade auf den neuesten Release Candidate aktualisiert und sehe jetzt Fehler bei Anrufen wie diesen:

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

Warum funktioniert das nicht mehr?

(Ich nehme an, ich könnte {action} loswerden und einfach eine Menge Controller herstellen, aber das fühlt sich chaotisch an.)

Josh Schultz
quelle

Antworten:

107

Wenn Sie für Ihre Aktion im Controller keine HttpMethod konfiguriert haben, wird davon ausgegangen, dass es sich in RC nur um HttpPost handelt. In der Beta wird davon ausgegangen, dass alle Methoden unterstützt werden - GET, PUT, POST und Delete. Dies ist eine kleine Änderung von Beta zu RC. Mit [AcceptVerbs ("GET", "POST")] können Sie problemlos mehr als eine http-Methode für Ihre Aktion festlegen.

Dinesh Ravva
quelle
Ich bin gerade darauf gestoßen, danke für das Update, aber neugierig, warum muss ich das mit meinen benutzerdefinierten Methoden machen, aber nicht mit der Standardmethode "Get"? Ich habe eine Get-Methode, die von der Vorlage für den Controller erstellt wurde, aber nicht dekoriert ist. ist das nur durch Konvention wegen des Namens Get?
SelAromDotNet
3
@ Josh: Ja! Wenn der Name der Aktionsmethode mit "Get ..." beginnt, müssen Sie ihn nicht als GET-Methode markieren. Lesen Sie hier mehr: asp.net/web-api/overview/web-api-routing-and-actions/…
Jenny O'Reilly
Ich habe das getan, was in der Antwort vorgeschlagen wurde, aber jetzt werden meine beiden Anrufe Get und Post an Get Action umgeleitet. Hilfe bitte?
Syed Ali Taqi
54

Alle oben genannten Informationen sind korrekt. Ich möchte auch darauf hinweisen, dass die [AcceptVerbs()]Anmerkung sowohl in den System.Web.Mvc- als auch in den System.Web.Http-Namespaces vorhanden ist.

Sie möchten System.Web.Http verwenden, wenn es sich um einen Web-API-Controller handelt.

Eric
quelle
@ Eric. Genial, das war der Grund, warum es bei mir nicht funktioniert hat. Ich hatte das Verb für meine Aktion, aber es wurde über Web.Mvc referenziert und funktionierte daher nicht.
Dreza
Großartig, du hast meinen Tag gerettet
Hossein Narimani Rad
Vielen Dank, denn System.Web.Mvc war nicht gut für mich.
Burak Karakuş
34

Obwohl dies keine Antwort auf das OP ist, hatte ich genau den gleichen Fehler aufgrund einer völlig anderen Grundursache. also für den Fall, dass dies jemand anderem hilft ...

Das Problem für mich war ein falsch benannter Methodenparameter, der dazu führte, dass WebAPI die Anforderung unerwartet weiterleitete. Ich habe die folgenden Methoden in meinem ProgrammesController:

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

DELETE-Anforderungen an ... / api / programme / 3 wurden nicht wie erwartet an DeleteProgramme weitergeleitet, sondern an GetProgrammeById, da DeleteProgramme keinen Parameternamen mit der ID hatte. GetProgrammeById lehnte dann natürlich das DELETE ab, da es als nur GETs akzeptierend markiert ist.

Das Update war also einfach:

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

Und alles ist gut. Dummer Fehler wirklich, aber schwer zu debuggen.

Carl Sharman
quelle
1
Wenn jemand URL-Routing verwendet, versuchen Sie es wie [Route ("{programmeId = programmeId: int}")]
sree
1
Das war es für mich. WebApiConfig -> MapHttpRoutes hatte -> routeTemplate: "api / {controller} / {id}", daher musste ein Parameter von 'id' verwendet werden.
HockeyJ
1
Ihre Antwort wies mich auf mein Problem hin, das etwas anders war. Ich habe den Namen eines [FromUri] -Parameters für die Methode geändert und ihn auf der Clientseite nicht aktualisiert
Matus
21

Wenn Sie Ihre Methode mit dekorieren HttpGet, fügen Sie usingoben am Controller Folgendes hinzu :

using System.Web.Http;

Wenn Sie verwenden System.Web.Mvc, kann dieses Problem auftreten.

Sohail xIN3N
quelle
5
Dies ist wahr und lächerlich .NET zeigt die Nachricht nicht klar an.
Teoman Shipahi
15

Dies ist sicherlich ein Wechsel von Beta zu RC. In dem in der Frage bereitgestellten Beispiel müssen Sie Ihre Aktion jetzt mit [HttpGet] oder [AcceptVerbs ("GET")] dekorieren.

Dies verursacht ein Problem, wenn Sie verbbasierte Aktionen (dh "GetSomething", "PostSomething") mit nicht verbbasierten Aktionen mischen möchten. Wenn Sie versuchen, die oben genannten Attribute zu verwenden, führt dies zu einem Konflikt mit jeder verbbasierten Aktion in Ihrem Controller. Eine Möglichkeit, dies zu erreichen, besteht darin, für jedes Verb separate Routen zu definieren und die Standardaktion auf den Namen des Verbs festzulegen. Dieser Ansatz kann zum Definieren untergeordneter Ressourcen in Ihrer API verwendet werden. Der folgende Code unterstützt beispielsweise: "/ resource / id / children", wobei id und children optional sind.

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

Hoffentlich werden zukünftige Versionen der Web-API dieses Szenario besser unterstützen. Derzeit ist ein Problem im Aspnetwebstack-Codeplex-Projekt http://aspnetwebstack.codeplex.com/workitem/184 protokolliert . Wenn Sie dies sehen möchten, stimmen Sie bitte über das Thema ab.

Jeremy
quelle
8

Haben Sie das gleiche Setup wie OP. Ein Controller mit vielen Aktionen ... weniger "chaotisch" :-)

In meinem Fall habe ich das "[HttpGet]" beim Hinzufügen einer neuen Aktion vergessen.

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}
Shaakir
quelle
6

Gleiches Problem wie oben, aber sehr unterschiedliche Wurzel. Für mich war es so, dass ich einen Endpunkt mit einer https-Umschreiberegel erreichte. Das Drücken auf http verursachte den Fehler und funktionierte wie erwartet mit https.

Vern D.
quelle
3

Ersetzen Sie den folgenden Code in diesem Pfad

Pfad:

App_Start => WebApiConfig.cs

Code:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}/{Param}",
            defaults: new { id = RouteParameter.Optional,
                            Param = RouteParameter.Optional }
                          );
Kazem Maleki
quelle
1

Ich weiß nicht, ob dies mit dem Beitrag des OP zusammenhängt, aber mir fehlte die Annotation [HttpGet], und genau das hat den Fehler verursacht, da die Methoden von @dinesh_ravva standardmäßig HttpPost sind.

Pierrick Martellière
quelle
0

Mein Problem war so einfach wie eine Nullreferenz, die in der zurückgegebenen Nachricht nicht angezeigt wurde. Ich musste meine API debuggen, um sie zu sehen.

Ninos
quelle