Ihre Routenkarte sieht wahrscheinlich so aus:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
Um jedoch mehrere Aktionen mit derselben http-Methode ausführen zu können, müssen Sie webapi über die folgende Route weitere Informationen bereitstellen:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional });
Beachten Sie, dass die routeTemplate jetzt eine Aktion enthält. Viele weitere Informationen hier: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Aktualisieren:
Okay, jetzt, wo ich denke, ich verstehe, wonach Sie hier suchen, ist eine andere Einstellung dazu:
Möglicherweise benötigen Sie den Aktions-URL-Parameter nicht und sollten den Inhalt, nach dem Sie suchen, auf andere Weise beschreiben. Da Sie sagen, dass die Methoden Daten von derselben Entität zurückgeben, lassen Sie einfach die Parameter die Beschreibung für Sie übernehmen.
Zum Beispiel könnten Ihre beiden Methoden in Folgendes umgewandelt werden:
public HttpResponseMessage Get()
{
return null;
}
public HttpResponseMessage Get(MyVm vm)
{
return null;
}
Welche Art von Daten übergeben Sie im MyVm-Objekt? Wenn Sie nur Variablen über den URI übergeben können, würde ich vorschlagen, diesen Weg zu gehen. Andernfalls müssen Sie das Objekt im Hauptteil der Anforderung senden, und das ist nicht sehr HTTP von Ihnen, wenn Sie ein GET ausführen (es funktioniert jedoch, verwenden Sie einfach [FromBody] vor MyVm).
Hoffentlich zeigt dies, dass Sie mehrere GET-Methoden in einem einzelnen Controller haben können, ohne den Aktionsnamen oder sogar das Attribut [HttpGet] zu verwenden.
Update ab Web API 2.
Mit dieser API-Konfiguration in Ihrer WebApiConfig.cs-Datei:
Sie können unseren Controller folgendermaßen routen:
Wobei ControllerName der Name Ihres Controllers ist (ohne "Controller"). Auf diese Weise können Sie jede Aktion mit der oben beschriebenen Route ausführen.
Weitere Informationen: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2
quelle
In der Web-API werden (standardmäßig) Methoden basierend auf einer Kombination aus HTTP-Methode und Routenwerten ausgewählt .
MyVm
sieht aus wie ein komplexes Objekt, das vom Formatierer aus dem Textkörper gelesen wird, sodass Sie zwei identische Methoden in Bezug auf Routendaten haben (da keiner von beiden Parameter aus der Route enthält) - was es dem Dispatcher (IHttpActionSelector
) unmöglich macht , mit dem entsprechenden übereinzustimmen .Sie müssen sie entweder durch Querystring- oder Routenparameter unterscheiden, um Mehrdeutigkeiten aufzulösen.
quelle
Nachdem Sie viel im Internet gesucht und versucht haben, das am besten geeignete Formular für die Routing-Karte zu finden, haben Sie Folgendes gefunden
Diese Zuordnung gilt sowohl für die Zuordnung von Aktionsnamen als auch für die grundlegende http-Konvention (GET, POST, PUT, DELETE).
quelle
Möglicherweise werden Ihre Webmethoden in dieselbe URL aufgelöst. Schauen Sie sich den folgenden Link an: -
http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
Daher müssen Sie möglicherweise Ihren Methodennamen zu Ihrer Routing-Tabelle hinzufügen.
quelle
Ohne Aktionen wären die Optionen:
Verschieben Sie eine der Methoden auf einen anderen Controller, damit sie nicht zusammenstoßen.
Verwenden Sie nur eine Methode, die den Parameter übernimmt, und rufen Sie die andere Methode aus Ihrem Code auf, wenn sie null ist.
quelle
Diese Lösung hat bei mir funktioniert.
Bitte platzieren Sie Route2 zuerst in WebApiConfig. Fügen Sie außerdem vor jeder Methode HttpGet und HttpPost hinzu und fügen Sie den Controller-Namen und den Methodennamen in die URL ein.
WebApiConfig =>
Controller =>
URL =>
quelle
Dies ist die Antwort für alle, die wissen, dass alles korrekt ist und 50 Mal überprüft haben .....
Stellen Sie sicher, dass Sie nicht wiederholt suchen
RouteConfig.cs
.Die Datei, die Sie bearbeiten möchten, heißt
WebApiConfig.cs
Außerdem sollte es wahrscheinlich genau so aussehen:
Ich hätte mir ungefähr 3 Stunden sparen können.
quelle
Ich habe festgestellt, dass ich bei zwei Get-Methoden, einer ohne Parameter und einer mit einem komplexen Typ als Parameter, denselben Fehler erhalten habe. Ich habe dieses Problem gelöst, indem ich als ersten Parameter einen Dummy-Parameter vom Typ int mit dem Namen Id hinzugefügt habe, gefolgt von meinem komplexen Typparameter. Ich habe dann den komplexen Typparameter zur Routenvorlage hinzugefügt. Folgendes hat bei mir funktioniert.
Zuerst bekommen:
Zweitens bekommen:
WebApiConfig:
quelle
Dies ist aufgrund der Verwendung des MVC-Controllers anstelle des Web-API-Controllers möglich. Überprüfen Sie den Namespace im Web-API-Controller wie folgt
Wenn der Namespace wie folgt lautet, wird beim Aufrufen der Web-API-Controller-Methode der obige Fehler angezeigt
quelle
Bitte überprüfen Sie, ob Sie zwei Methoden haben, die den unterschiedlichen Namen und die gleichen Parameter haben.
Wenn ja, löschen Sie bitte eine der Methoden und versuchen Sie es.
quelle
Ich bin auf dieses Problem gestoßen, als ich versucht habe, meine WebAPI-Controller mit zusätzlichen Aktionen zu erweitern.
Angenommen, Sie hätten
Es gibt jetzt zwei Methoden, die die Anforderung für / api / controller erfüllen, wodurch das von TS beschriebene Problem ausgelöst wird.
Ich wollte meinen zusätzlichen Aktionen keine "Dummy" -Parameter hinzufügen, also habe ich mir Standardaktionen angesehen und mir Folgendes ausgedacht:
für die erste Methode in Kombination mit der "dualen" Routenbindung:
Beachten Sie, dass Sie, obwohl die erste Routenvorlage anscheinend keinen "Aktions" -Parameter enthält, dennoch eine Standardaktion konfigurieren können, mit der wir das Routing der "normalen" WebAPI-Aufrufe und der Aufrufe an die zusätzliche Aktion trennen können.
quelle
In meinem Fall war alles richtig
1) Die Webkonfiguration wurde ordnungsgemäß konfiguriert. 2) Das Routenpräfix und die Routenattribute waren ordnungsgemäß
Trotzdem bekam ich den Fehler. In meinem Fall zeigte das Attribut "Route" (durch Drücken von F12) auf System.Web.MVc, nicht jedoch auf System.Web.Http, was das Problem verursachte.
quelle
Sie können
[Route("api/[controller]/[action]")]
Ihrer Controller-Klasse hinzufügen .quelle
Ich weiß, dass es eine alte Frage ist, aber manchmal, wenn Sie Serviceressourcen wie AngularJS verwenden, um eine Verbindung zu WebAPI herzustellen, stellen Sie sicher, dass Sie die richtige Route verwenden. Andernfalls tritt dieser Fehler auf.
quelle
Stellen Sie sicher, dass Sie Ihre Controller-Methoden NICHT für die Standardaktionen GET | PUT | POST | DELETE mit dem Attribut [HttpPost / Put / Get / Delete] dekorieren. Ich hatte dieses Attibute zu meiner Vanilla Post-Controller-Aktion hinzugefügt und es verursachte einen 404.
Ich hoffe, dies hilft jemandem, da es sehr frustrierend sein und den Fortschritt zum Stillstand bringen kann.
quelle
Zum Beispiel => TestController
Wenn Sie nur die Datei WebApiConfig.cs ändern können.
Das ist es :)
Und Ergebnis:
quelle
Haben Sie versucht wie:
quelle
HttpGet
Attribut keinen Konstruktor hat, der ein Zeichenfolgenargument akzeptiert.