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.