Web-API-Routing - api / {Controller} / {Aktion} / {ID} "Dysfunktionen" api / {Controller} / {ID}
Habe ich die Standard-Route in der Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Ich wollte in der Lage sein, auf eine bestimmte Funktion, so habe ich eine andere route:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
So, in meinem controller habe ich:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Aufrufen .../api/records/bycategoryid/5
wird mir geben, was ich will.
Allerdings ruft .../api/records/1
wird mir der Fehler
Mehrere Maßnahmen gefunden wurden, die mit dem Wunsch: ...
Verstehe ich, warum das so ist - die Routen, die Sie nur die definieren, welche URLs gültig sind, aber wenn es um die matching-Funktion, die beide Get(int id)
und ByCategoryId(int id)
match api/{controller}/{id}
was verwirrt Rahmen.
Was muss ich tun, um den Standard-API-route wieder zu arbeiten, und halten Sie die ein mit {action}
? Ich dachte, der Erstellung einer anderen Domänencontroller mit dem Namen RecordByCategoryIdController
entsprechend der Standard-API-route, für die ich bitten .../api/recordbycategoryid/5
. Allerdings finde ich, dass das eine "schmutzige" (und damit unbefriedigende) Lösung. Ich habe nach Antworten gesucht auf diese und keine Anleitung vorhanden ist, mit einer route mit {action}
einmal erwähnt dieses Problem.
InformationsquelleAutor der Frage Mickael Caruso | 2012-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Route-engine verwendet die gleiche Sequenz, wie Sie Regeln hinzufügen in es. Einmal wird der erste übereinstimmende Regel wird es aufhören, die Kontrolle anderer Vorschriften, und nutzen Sie diese, um die Suche für controller und Aktion.
So, man soll:
Setzen Ihre speziellen Regeln vor, Ihre Allgemeinen Regeln(wie Standard), was bedeutet, dass die Verwendung
RouteTable.Routes.MapHttpRoute
zuordnen "WithActionApi" zuerst, dann "DefaultApi".Entfernen Sie die
defaults: new { id = System.Web.Http.RouteParameter.Optional }
- parameter der "WithActionApi Regel", weil einmal die id ist optional, url wie "/api/{part1}/{part2}" geht nie in die "DefaultApi".Hinzufügen eines namens "action" Ihre "DefaultApi" zu sagen, die route-engine, die Aktion zu geben. Sonst haben Sie mehr als eine Aktionen in deinem controller, der Motor wird nicht wissen, welche zu benutzen und wirft "Mehrere Aktionen gefunden wurden, die mit dem Wunsch: ...". Dann machen Sie mit Ihrer Get-Methode, verwenden eine ActionNameAttribute.
Also Ihre route so:
Und controller:
InformationsquelleAutor der Antwort Chris Li
Können Sie bei der Lösung Ihres Problems mit Hilfe von Attribut-routing
Controller
URI in jquery
Route-Konfiguration
und Ihre Standard-routing als default - convention-based routing
Controller
URI in Jquery
Route-Konfiguration
Review-Artikel für mehr Informationen Attribut-routing und onvention-based routing hier & diese
InformationsquelleAutor der Antwort MSTdev