Ich beginne mit der Verwendung des MVC4-Web-API-Projekts. Ich habe einen Controller mit mehreren HttpPost
Methoden. Der Controller sieht folgendermaßen aus:
Regler
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Hier wird MyRequestTemplate
die Vorlagenklasse dargestellt, die für die Verarbeitung des durch die Anforderung eingehenden Json verantwortlich ist.
Error:
Wenn ich mit Fiddler eine Anfrage stelle http://localhost:52370/api/VTRouting/TSPRoute
oder http://localhost:52370/api/VTRouting/Route
eine Fehlermeldung erhalte:
Es wurden mehrere Aktionen gefunden, die der Anforderung entsprechen
Wenn ich eine der oben genannten Methoden entferne, funktioniert es einwandfrei.
Global.asax
Ich habe versucht, die Standard-Routing-Tabelle global.asax
in zu ändern, aber es wird immer noch der Fehler angezeigt. Ich glaube, ich habe Probleme beim Definieren von Routen in global.asax. Folgendes mache ich in global.asax.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Ich mache die Anfrage in Fiddler mit POST und übergebe json in RequestBody für MyRequestTemplate.
Eine viel bessere Lösung für Ihr Problem wäre die Verwendung, mit
Route
der Sie die Route auf der Methode durch Annotation angeben können:quelle
Route
undTSPRoute
?verwenden:
Es ist kein RESTful-Ansatz mehr, aber Sie können Ihre Aktionen jetzt beim Namen nennen (anstatt die Web-API anhand des Verbs automatisch eine für Sie bestimmen zu lassen):
Entgegen der landläufigen Meinung ist an diesem Ansatz nichts auszusetzen, und er missbraucht die Web-API nicht. Sie können weiterhin alle fantastischen Funktionen der Web-API nutzen (Delegieren von Handlern, Aushandeln von Inhalten, Mediatyp-Formatierern usw.) - Sie verzichten einfach auf den RESTful-Ansatz.
quelle
Ein Web-API-Endpunkt (Controller) ist eine einzelne Ressource, die Verben zum Abrufen / Veröffentlichen / Setzen / Löschen akzeptiert. Es ist kein normaler MVC-Controller.
Notwendigerweise
/api/VTRouting
kann es nur eine HttpPost-Methode geben, die die von Ihnen gesendeten Parameter akzeptiert. Der Funktionsname spielt keine Rolle , solange Sie mit dem [http] -Ding dekorieren. Ich habe es aber nie versucht.Bearbeiten: Dies funktioniert nicht. Bei der Auflösung scheint es sich um die Anzahl der Parameter zu handeln, ohne zu versuchen, eine Modellbindung an den Typ vorzunehmen.
Sie können die Funktionen überladen, um verschiedene Parameter zu akzeptieren. Ich bin mir ziemlich sicher, dass Sie in Ordnung wären, wenn Sie es so deklarieren würden, aber andere (inkompatible) Parameter als die Methoden verwenden würden. Wenn die Parameter identisch sind, haben Sie kein Glück, da die Modellbindung nicht weiß, welche Sie gemeint haben.
Dieser Teil funktioniert
Die Standardvorlage, die sie beim Erstellen einer neuen Vorlage angeben, macht dies ziemlich deutlich, und ich würde sagen, Sie sollten sich an diese Konvention halten:
Wenn Sie eine Klasse für Ajax erstellen möchten, die viele Aufgaben ausführt, gibt es keinen großen Grund, kein Standard-Controller- / Aktionsmuster zu verwenden. Der einzige wirkliche Unterschied besteht darin, dass Ihre Methodensignaturen nicht so hübsch sind und Sie die Dinge einpacken müssen,
Json( returnValue)
bevor Sie sie zurückgeben.Bearbeiten:
Das Überladen funktioniert einwandfrei, wenn die Standardvorlage (bearbeitet, um sie einzuschließen) verwendet wird, wenn einfache Typen verwendet werden. Ich habe auch den umgekehrten Weg mit 2 benutzerdefinierten Objekten mit unterschiedlichen Signaturen getestet. Ich könnte es nie zum Laufen bringen.
In diesem Fall hat das bei mir funktioniert. Sehen Sie, wohin es Sie führt. Ausnahme nur zum Testen.
Und so genannt von der Konsole genannt:
quelle
Es ist möglich, mehrere Get- und Post-Methoden in demselben Web-API-Controller hinzuzufügen. Hier verursacht die Standardroute das Problem. Die Web-API prüft, ob die Route von oben nach unten übereinstimmt und ob Ihre Standardroute für alle Anforderungen übereinstimmt. Standardmäßig ist nur eine Get- und Post-Methode in einem Controller möglich. Platzieren Sie entweder den folgenden Code oben oder die Standardroute auskommentieren / löschen
quelle
Setzen Sie das Routenpräfix [RoutePrefix ("api / Profiles")] auf Controller-Ebene und setzen Sie eine Route auf die Aktionsmethode [Route ("LikeProfile")]. Sie müssen nichts in der Datei global.asax ändern
quelle
Ich denke, die Frage wurde bereits beantwortet. Ich suchte auch nach einem WebApi-Controller, der dieselben signierten Methoden, aber unterschiedliche Namen hat. Ich habe versucht, den Rechner als WebApi zu implementieren. Der Rechner verfügt über 4 Methoden mit derselben Signatur, aber unterschiedlichen Namen.
und in der WebApiConfig-Datei, die Sie bereits haben
Stellen Sie einfach die Authentifizierung / Autorisierung auf IIS ein und Sie sind fertig!
Hoffe das hilft!
quelle
Sie können diesen Ansatz verwenden:
quelle
Ich bin nicht sicher, ob das Überladen der get / post-Methode das Konzept der restfull-API verletzt, aber es funktioniert. Wenn jemand diese Angelegenheit hätte aufklären können. Was ist, wenn ich einen Uri als habe?
Wie Sie vielleicht gesehen haben, ist mein Journal eine Art Aggregateroot, obwohl ich einen anderen Controller nur für die Veröffentlichung definieren und die ID-Nummer der Veröffentlichung in meiner URL übergeben kann. Dies ist jedoch viel sinnvoller. da meine publikation ohne journal selbst nicht existieren würde.
quelle
Ich habe gerade "action = action_name" zur URL hinzugefügt und auf diese Weise weiß die Routing-Engine, welche Aktion ich möchte. Ich habe den Aktionen auch das ActionName-Attribut hinzugefügt, bin mir aber nicht sicher, ob es benötigt wird.
quelle
Beste und einfachste Erklärung, die ich zu diesem Thema gesehen habe - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx
Ich habe es nur mit Route zum Laufen gebracht und brauchte RoutePrefix nicht.
Zum Beispiel in der Steuerung
und
Dann geht der Funktionsname in jquery wie folgt aus:
oder
quelle