Ich habe die Standardroute in 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 abzuzielen, also habe ich eine andere Route erstellt:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
In meinem Controller habe ich also:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Anrufen .../api/records/bycategoryid/5
gibt mir, was ich will. Ein Anruf .../api/records/1
gibt mir jedoch den Fehler
Es wurden mehrere Aktionen gefunden, die der Anforderung entsprechen: ...
Ich verstehe, warum das so ist - die Routen definieren nur, welche URLs gültig sind, aber wenn es um Funktionsabgleich geht, sowohl um Get(int id)
als auch um ByCategoryId(int id)
Übereinstimmung api/{controller}/{id}
, was das Framework verwirrt .
Was muss ich tun, damit die Standard-API-Route wieder funktioniert und die beibehalten wird {action}
? Ich dachte daran, einen anderen Controller RecordByCategoryIdController
zu erstellen , der der Standard-API-Route entspricht, für die ich eine Anfrage stellen würde .../api/recordbycategoryid/5
. Ich finde das jedoch eine "schmutzige" (also unbefriedigende) Lösung. Ich habe nach Antworten zu diesem Thema gesucht und es gibt kein Tutorial zur Verwendung einer Route {action}
, in dem dieses Problem überhaupt erwähnt wird.
quelle
id
optional ist, wird die URL wie/api/{part1}/{part2}
möglicherweise immer noch in dieDefaultApi
Route verschoben, wenn für dieWithActionApi
Route keine übereinstimmende Aktion gefunden wird . Bitte korrigieren Sie mich, wenn ich falsch liege.Sie können Ihr Problem mithilfe des Attribut-Routings lösen
Regler
URI in jquery
Routenkonfiguration
und Ihr Standardrouting funktioniert als standardmäßiges konventionelles Routing
Regler
URI in Jquery
Routenkonfiguration
Weitere Informationen finden Sie im Artikel. Attribut-Routing und onvention-basiertes Routing hier und hier
quelle
Versuche dies.
quelle
Der mögliche Grund kann auch sein, dass Sie Controller nicht von ApiController geerbt haben. Es passierte eine Weile, bis ich das Gleiche verstanden hatte.
quelle
Fügen Sie zur Unterscheidung der Routen eine Einschränkung hinzu, deren ID numerisch sein muss:
quelle